Пространство имен XML для HashSet из перечислений - PullRequest
0 голосов
/ 07 ноября 2018

Мне трудно десериализовать HashSet из перечислений. В настоящее время значения из XML не десериализуются в объект c #.

У меня есть XML-файл, который имеет это:

<MyHashSetOfEnums xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <a:MyEnum>Red</a:MyEnum>
  <a:MyEnum>Green</a:MyEnum>
  <a:MyEnum>Blue</a:MyEnum>
</MyHashSetOfEnums>

И класс c #, который я пытаюсь десериализовать, выглядит примерно так:

[DataContract]
public class MyClass
{
    [DataMember]
    public HashSet<MyEnum> MyHashSetOfEnums { get; private set; }
}

Enum выглядит так:

public enum MyEnum
{
    Red,
    Green,
    Blue
}

У меня есть рабочий код, который десериализует одно перечисление и другой, который десериализует HashSet строк / целых. Оба из них используют различные пространства имен XML для правильной десериализации. Но теперь мне нужно объединить две идеи, и я не могу заставить что-то работать. Это возможно? Или я стреляю по чему-то недостижимому здесь?

PS: я не использую Newtonsoft и не могу обновить наши утилиты сериализации для использования Newtonsoft

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете попробовать , указав пространства имен напрямую , но вот рабочая сериализация (без атрибутов DataContract, но они не должны изменяться). Добавлен конструктор для частного набора MyHashSetOfEnums.

using System;
using System.IO;
using System.Collections.Generic;
using System.Xml.Serialization;

public enum MyEnum
{
    Red,
    Green,
    Blue
}
public class MyClass
{
    public HashSet<MyEnum> MyHashSetOfEnums { get; private set; }
    public MyClass() {
        MyHashSetOfEnums = new HashSet<MyEnum>(); 
    }
}
public class Program
{
    public static void Main()
    {
        var set = new MyClass();
        set.MyHashSetOfEnums.Add(MyEnum.Blue);
        set.MyHashSetOfEnums.Add(MyEnum.Red);

        var xs = new XmlSerializer(typeof(MyClass));
        string xml;
        using (var writer = new StringWriter()) {
            xs.Serialize(writer, set);
            xml = writer.ToString();
            Console.WriteLine(xml);
        }
        using (var reader = new StringReader(xml)) {
            var set2 = (MyClass)xs.Deserialize(reader);
            foreach (MyEnum s in set2.MyHashSetOfEnums)
                Console.WriteLine(s);
        }
    }
}

Вот стандартный вывод:

<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyHashSetOfEnums>
    <MyEnum>Blue</MyEnum>
    <MyEnum>Red</MyEnum>
  </MyHashSetOfEnums>
</MyClass>
Blue
Red

Возможно, вашим корневым узлом XML должен быть MyClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...