Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > XmlSerializer - запись xsi:type


Автор: PashaPash 4.2.2009, 18:18
Есть простой класс и код, который его сериализует в Xml:
Код

[System.Xml.Serialization.XmlRoot()]
public class SomeClass
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }
}
...
SomeClass objectToSerialize = new SomeClass()
{
    Property1 = 42,
    Property2 = "some string"
};

System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(SomeClass));

StringBuilder buffer = new StringBuilder();
using (var writer = new StringWriter(buffer))
{
    serializer.Serialize(writer, objectToSerialize);
}

Console.WriteLine(buffer.ToString());

На выходе получается примерно следующий XML:
Код

<?xml version="1.0" encoding="utf-16"?>
<SomeClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Property1>42</Property1>
  <Property2>some string</Property2>
</SomeClass>

А хотелось бы увидеть строго определенные типы для каждого поля, примерно вот так:
Код

<?xml version="1.0" encoding="utf-16"?>
<SomeClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Property1 xsi:type="xsd:integer">42</Property1>
  <Property2 xsi:type="xsd:string">some string</Property2>
</SomeClass>

Может быть в сериализаторе есть magic switch? В мсдн сходу не нашел. :(

Автор: Rififi 5.2.2009, 12:34
PashaPash, 
в чем Тайный смысл такой жесткой типизации?
ps. использовать object вместо типов?

Автор: PashaPash 5.2.2009, 13:24
Rififi, смысл в том, что вещь под названием Sql Server Data Services требует именно жесткой типизации при insert/update - там на стороне сервера нет строгой схемы. Т.е. да, там object-ы с Property Bag-ами.
Я пытаюсь набросать Linq To SDS provider, селекты с where и orderby уже работают - при десериализации XmlSerializer типы понимает. А вот сериализировать для инсерта сейчас приходится через ж - делать обертку, которая генерит XElement-ы с аттрибутами, и уже обертку сериализовать. Идея не моя, и вроде готовый код уже есть, но как-то некрасиво, вдруг есть magic switch.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)