XML-сериализация перечислений - PullRequest
9 голосов
/ 08 октября 2010

У меня проблемы с сериализацией значений перечисления.

Вот код:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class REQUEST
{
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ID;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public REQUESTTypetype Type;
}

public enum REQUESTTypetype
{
    One,
    Two,
    Three,
    Four,
}

...

REQUEST request = new REQUEST();
request.ID = "1234";
request.Type = REQUESTTypetype.One;

XmlDocument doc = new XmlDocument();
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
XmlSerializer xs = new XmlSerializer(typeof(REQUEST));
xs.Serialize(sw, request_group);
ms.Position = 0;
doc.Load(ms);
TestWriteXml(doc, @"C:\xml_test.xml");

Результат:

<?xml version="1.0" encoding="utf-8" ?> 
<REQUEST ID="1234" />

Почему перечисление не сериализуется?Я использую .NET Framework 2.0.

Спасибо.

Ответы [ 5 ]

17 голосов
/ 08 октября 2010

Я нашел, что было не так.Для каждого типа перечисления

[System.Xml.Serialization.XmlAttributeAttribute()]
public REQUESTTypetype Type;

я получил это:

[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool TypeSpecified;

И в коде я должен сделать это:

request.Type = REQUESTTypetype.One;
request.TypeSpecified = true;

Теперь работает нормальноЯ должен был опубликовать их в своем вопросе, но я не обращал внимания на этих "указанных" участников вообще.Спасибо за ваши ответы.

2 голосов
/ 08 октября 2010

Вы видите ту же проблему, когда устанавливаете тип «Два» или «Три»? Это потому, что «Один» является значением по умолчанию и поэтому можно предположить? Это может быть какой-то артефакт загрузки этого в XmlDocument, а затем сохранения его с вашим кодом, который вы не показали (TestWriteXml).

Это слегка измененная версия вашего кода (я пишу в StringBuilder, а затем в конце пишу ToString) ...

    REQUEST request = new REQUEST();
    request.ID = "1234";
    request.Type = REQUESTTypetype.One;


    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    XmlSerializer xs = new XmlSerializer(typeof(REQUEST));
    xs.Serialize(sw, request);
    Console.WriteLine(sb.ToString());

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

<?xml version="1.0" encoding="utf-16"?>
<REQUEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:/
/www.w3.org/2001/XMLSchema" ID="1234" Type="One" />

Я не изменил определение REQUEST или перечисление REQUESTTypetype.

0 голосов
/ 08 октября 2010

В вашем фактическом коде есть член:

  • public
  • read + write (для полей: не только для чтения; для свойств: public get + set)
  • открытого типа

?

Все 3 должны быть истинными.Для вложенных типов каждый родительский тип во вложении должен быть открытым.

Дополнительные вещи, которые исключают его:

  • nullable и null
  • , если DefaultValue
  • a IfSerialize или указанное возвращенное значение false
  • это IxmlSerializable
0 голосов
/ 08 октября 2010

Попробуйте добавить атрибут [Flags] в перечисление.

0 голосов
/ 08 октября 2010

Вы можете использовать атрибут Xml.Serialization.XmlEnum ( см. Здесь ), чтобы украсить значения перечисления.

Здесь есть пост от Kurt Claeys здесь это тоже может помочь.

...