Выходные xml-типы XmlSerializer

Я использую 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>

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

Спасибо

Крейг.


person Jim    schedule 28.11.2011    source источник
comment
Не знаю, правильно ли я понимаю вашу проблему. Используете ли вы XML, который всегда имеет одинаковую структуру, но типы элементов могут различаться?   -  person Martijn B    schedule 30.11.2011
comment
Я конвертирую класс в xml. Класс предоставляется третьей стороной. Я беру xml и индексирую содержимое. Мне нужно знать, какие поля являются двоичными. Если есть простой способ создать xsd, я тоже могу это принять. Я мог бы предоставить код для создания файла xsd. Возможно, это был глупый вопрос.   -  person Jim    schedule 01.12.2011
comment
Если ваш класс предоставляется третьей стороной, вы знаете свои свойства и типы свойств и можете вывести из них свой XML. Вы даже можете создать для него XSD вручную.   -  person Martijn B    schedule 01.12.2011
comment
Я думаю, что я создам xsd вручную. Я надеялся, что уже есть класс для создания xsd. Я сделаю это вручную. Если вы ответите на вопрос этим, я отмечу это, так как это максимально близко.   -  person Jim    schedule 01.12.2011


Ответы (2)


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

person Martijn B    schedule 01.12.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:

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

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

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

person Chris    schedule 28.11.2011
comment
Привет, к сожалению, это не сработает. У меня нет формата. Мне нужно знать, что строка двоичная. Мне нужно добавить тип в исходящий xml или сгенерировать схему или написать свой собственный сериализатор. Вашего решения будет недостаточно. Я хорошо знаю, что сериализатор работает, если я знаю его двоичный код, но я этого не знаю. - person Jim; 28.11.2011
comment
Итак, вы пытаетесь контролировать, как MyClass сериализуется, но вы вообще не можете украсить класс. Но вам нужно вывести его в формате, который вы описываете? это правильно? - person Chris; 28.11.2011
comment
Я могу украсить класс любыми атрибутами, так как они могут быть переданы сериализатору в переопределениях. Я могу сгенерировать xsd. Я могу размышлять над классом, я могу сериализовать класс. Мне просто нужно знать, что такое xml-тип двоичных полей. Я думаю, что я собираюсь отказаться от сериализатора и использовать отражение. Я не могу изменить класс. Класс предоставляется третьей стороной. - person Jim; 28.11.2011