Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 12.07.2011, 12:59   #1
ds.Dante
Профессионал
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Адрес: Москва
Сообщений: 2,997
Репутация: 1446
По умолчанию XML-сериализация проблемных классов (Font, Color, и т. д)

Широко известна проблема, связанная с тем, что некоторые стандартные классы по тем или иным причинам не могут быть сериализованы. Например, Font не имеет конструктора без параметров. В MSDN можно найти пример обхода этой проблемы - класс-оболочка на 100 строк кода. Я нашёл гораздо более простой вариант - использовать TypeDescriptor.GetConverter() для преобразования объекта в строку. Этот вариант занимает всего несколько строчек, и практически незаметен при рефакторинге. В файл сохраняются только те свойства шрифта, которые отличаются от умолчаний.

Код:

using System;
using System.IO;
using System.Drawing;
using System.ComponentModel;
using System.Xml.Serialization;

class Program
{
	static void Main (string[] args)
	{
		Options options;

		// Загружаем настройки
		XmlSerializer serializer = new XmlSerializer (typeof (Options));
		StreamReader reader = new StreamReader ("data.xml");
		options = (Options)serializer.Deserialize (reader);
		reader.Close ();

		// Увеличиваем размер шрифта на 1, выводим на экран его свойства
		options.font = new Font (options.font.Name, options.font.Size + 1);
		Console.WriteLine (options.font.ToString ());
		Console.ReadKey ();

		// Сохраняем шрифт
		StreamWriter writer = new StreamWriter ("data.xml");
		serializer.Serialize (writer, options);
		writer.Close ();
	}
}

public class Options
{
	[XmlIgnore]
	public Font font;

	// Этот параметр (де)сериализуется вместо font
	public string fontSerializable
	{
		get { return TypeDescriptor.GetConverter (typeof (Font)).ConvertToString (font); }
		set { font = (Font)TypeDescriptor.GetConverter (typeof (Font)).ConvertFromString (value); }
	}
}

Файл data.xml:
Код HTML:
<?xml version="1.0" encoding="utf-8"?>
<Options xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <fontSerializable>Arial; 46pt</fontSerializable>
</Options>
ds.Dante вне форума   Ответить с цитированием
Старый 18.07.2011, 20:12   #2
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 288
Репутация: 98
По умолчанию

Насчёт Font согласен, хотя мы в проекте просто выносили нужные нам свойства, чтобы что-нибудь лишнее не тащить.
А вот Color этож от 1-й до 4-х циферек всего-то.
Spawn™Production® вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas.Font.Style := Label.Font.Style; не выходит ArtGrek Общие вопросы Delphi 3 23.02.2011 20:55
TStaticText и свойства Color / Font.Color Bad-XxX Общие вопросы Delphi 1 02.10.2010 19:53
CheckBox->Font->Color MBentefor Общие вопросы C/C++ 2 21.04.2010 01:48
XML Сериализация ds.Dante Общие вопросы .NET 0 21.10.2009 13:09
xml сериализация ???? Maladoj Общие вопросы .NET 2 28.03.2009 13:06


05:09.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru