Cw XmlSerializer
09-01-2005 02:03
к комментариям - к полной версии
- понравилось!
Я позволю себе отложить до след. раза вопрос о том, зачем .NET Framework имеет 2 встроенных serialization engines. Один - из System.Xml.Serialization, другой - из System.Runtime.Serialization. Скажу сейчас только, что XmlSerializer работает со многими ограничениями security, и, что не менее важно, он занимается только сериализацией в XML. SoapFormatter() и BinaryFormatter() разработаны скорее больше для marshaling, и имеют дело с сетевой передачей сериализированных об'ектов, сохраняя также и object identity. Если этого мало, - ждите след. раза для более подробной дискуссии.
Сейчас я хотел сказать пару слов об XmlSerializer() и его возможностях обрабатывать choice particles из XSD. Во-первых, обращает на себя внимание аттрибут XmlChoiceIdentifierAttribute. Вот как им ,например, можно пользоваться :
[XmlType(Namespace="http://tempuri.org/finance.xsd",
IncludeInSchema=false)]
public enum CurrencyType
{
USDollars,
Euro,
}
[XmlType(Namespace="http://tempuri.org/finance.xsd")]
[XmlRoot("Payment", Namespace="http://tempuri.org/finance.xsd",
IsNullable=false)]
public class Payment
{
[XmlElement("USDollars", typeof(decimal))]
[XmlElement("Euro", typeof(decimal))]
[XmlChoiceIdentifier("Currency")]
public decimal amount;
[XmlIgnore()]
public CurrencyType Currency;
}
Здесь элементы USDollars и Euro соотвествуют очевидному choice particle, кот. привести здесь не могу из-за особенностей поддержки любых (в том числе и XML тэгов) в li.ru.
Вот не менее очевидный код код его сериализации:
StringWriter sw = new StringWriter();
Payment pt = new Payment();
pt.Currency = CurrencyType.USDollars;
pt.amount = 5.32M;
XmlSerializer ser2 = new XmlSerializer(typeof(Payment));
ser2.Serialize(sw, pt);
Console.Write(sw.ToString());
Этим примером я хотел сказать, что несмотря на то, что C# не поддержижает напрямую конструкций choice из XSD - выход все-таки есть.
Но Cw имеет встроенную поддержку для подобных конструкций. Продолжая начатый пример, перепишем то же на Cw
class CwPayment
{
struct
{
choice { decimal USDollars; decimal Euro; }
}
}
Вот и все. Но вот если пытаться серализировать этом класс с помощью XmlSerializer() - не получается. Он ориентирован на работу с аттрибутами из System.Xml. Никаких конструкций choice он не знает. ( как и всего Cw, собственно). Вот и пришлось разработчикам Cw писать свой XmlSerializer. Для желающих он доступен из Microsoft.Comega. Enjoy.
P.S. Не могу не привести и очень короткий пример сериализации из Cw:
pt = <cwpayment>
<euro>0.0</euro>
</cwpayment>;
decimal? initialAmount = pt.USDollars;
StringWriter sw = new StringWriter();
new Microsoft.Comega.XmlSerializer(typeof(CwPayment)).Serialize(sw, pt);
Console.WriteLine(sw.ToString());
вверх^
к полной версии
понравилось!
в evernote