Сериализация свойств смешанного типа до xml в C# - PullRequest
0 голосов
/ 10 января 2020

Например, у меня есть три класса

public class A
{
    public string Abc { get; set; }
}

public class B
{
    public string Xyz { get; set; }
}

public class C
{
    private object itemField;

    [XmlElement("A", typeof(A))]
    [XmlElement("B", typeof(B))]
    public object Item
    {
        get
        {
            return itemField;
        }
        set
        {
            itemField = value;
        }
    }
}

И я пытаюсь сериализовать экземпляр класса C

var b = new B
{
    Xyz = "123123"
};
var c = new C
{
    Item = b
};
var serializer = new XmlSerializer<C>();
var aaa = serializer.Serialize(c);

Тогда вывод будет

- C
- A
--- Xyz
---- 123123
--- / Xyz
- / A
- / C

Но я ожидаю

- C
- B
--- Xyz
---- 123123
--- / Xyz
- / B
- / C

Как я могу это сделать? (Я преобразовал amazon mws xsd в классы с помощью xsd.exe, и некоторые выходные классы похожи на C class, поэтому у меня возникают проблемы при попытке сериализации этих классов.)

Я использую net framework 4.6.1 и для сериализации XSerializer ( nuget.org / packages / XSerializer / 0.4.2 ).

*** РЕДАКТИРОВАТЬ: Я нашел проблему, проблема не в сериализатору. "xsd.exe" допускал ошибки в многомерных массивах при конвертации файлов xsd. Я отредактировал классы для атрибутов сериализации, и это сработало. Пример:

// I changed "[XmlArrayItem("Name", typeof(TypeName))]" To that: 
[XmlArrayItem("Name", typeof(TypeName[]))]
public TypeName[][] PropName { get; set; }

Спасибо всем

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я получаю желаемые результаты с XmlSerializer. Пространство имен System.Xml.Serialization

var writer = new XmlSerializer(typeof(C));
var file = File.Create(strfilepath);
writer.Serialize(file, c);
file.Close();

Выход

<?xml version="1.0"?>
<C xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <B>
    <Xyz>123123</Xyz>
  </B>
</C>
0 голосов
/ 10 января 2020

Я не знаю об этом nuget, но сериализация без него (я использовал метод расширения из этого поста ):

var test = SerializeObject<C>(c);

дает ожидаемый результат

<?xml version="1.0" encoding="utf-16"?>
<C xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <B>
    <Xyz>123123</Xyz>
  </B>
</C>
...