Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2011, 12:59   #1
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию 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
Сообщений: 287
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas.Font.Style := Label.Font.Style; не выходит ArtGrek Общие вопросы Delphi 3 23.02.2011 19: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 12:06