XmlSerializer выводит типы xml - PullRequest
       2

XmlSerializer выводит типы xml

0 голосов
/ 28 ноября 2011

Я использую XmlSerializer, и мне было интересно, если есть какой-либо способ, используя переопределения или что-то на этот счет, чтобы заставить XmlSerializer выводить типы некоторых узлов.

Моя проблема в том, что я сериализовал байтовый массив.

class MyClass {
  public string Name { get; set; }
  public byte[] Bytes { get; set; }
}

Я использую xml в общем сервисе. Служба собирает XML как.

<MyClass>
  <Name>Test</Name>
  <Bytes>U2NhcnkgQnVnZ2Vy</Bytes>
</MyClass>

Есть ли способ сгенерировать xsd во время выполнения или как-нибудь вывести что-то вроде этого.

Я не могу изменить класс, который сериализую, но могу применить переопределения к сериализатору или каким-либо другим способом управлять сериализацией.

<Bytes xsi:type='BinaryOfSomeKind'>BlahBlah</Bytes>

Мне нужно знать, что данные как-то двоичные.

Спасибо

Craig.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Если ваш класс предоставлен третьей стороной, то вы знаете свои свойства и типы свойств и можете вывести из него ваши XML и XSD.Вы можете создать свой XSD вручную или с помощью инструмента XML, например XMLSpy (не бесплатный BTW) или XMLFox , который является бесплатным.

0 голосов
/ 28 ноября 2011

Если вы знаете, что XML будет в том формате, который вы указали в вопросе, и у вас есть готовый класс, вы можете украсить его так, чтобы он был десериализован.

Класс десериализации:

[XmlTypeAttribute]
[XmlRootAttribute("MyClass")]
public class MyClass
{
    [XmlElementAttribute("Name")]
    public string Name { get; set; }

    [XmlElementAttribute("Bytes")]
    public byte[] Bytes { get; set; }
}

Метод десериализации

 public static object Deserialize(string xml)
 {
        var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(MyClass));
        using (var reader = XmlReader.Create(new StringReader(xml)))
        {
            return (MyClass)deserializer.Deserialize(reader);
        }
 }

Основной метод

    static void Main(string[] args)
    {
        string xml = @"<MyClass>
        <Name>Test</Name>
        <Bytes>U2NhcnkgQnVnZ2Vy</Bytes>
         </MyClass>";

        MyClass obj = (MyClass)Deserialize(xml);
        Console.ReadKey();

    }

Обязательно добавьте следующие операторы использования:

using System.Xml.Serialization;
using System.Xml; 

Он десериализовал его в obj с «Test» в качестве байтового массива.

Если вы генерируете XSD во время выполнения, то нет никакого способа узнать, какие свойства существуют, и было бы просто использовать отражение дляпроверить определенные свойства, а затем выяснить, к каким типам они относятся, это то, что вам нужно?

...