枚举的 HashSet 的 XML 命名空间

XML Namespace for HashSet of Enums

提问人:st0ve 提问时间:11/7/2018 最后编辑:st0ve 更新时间:11/9/2018 访问量:191

问:

我很难反序列化枚举的 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; }
}

枚举如下所示:

public enum MyEnum
{
    Red,
    Green,
    Blue
}

我有反序列化单个枚举的工作代码和另一个反序列化字符串/整数的 HashSet 的工作代码。这两者都使用不同的 XML 命名空间来正确反序列化。但现在我需要将这两个想法结合起来,并且无法使某些东西起作用。这可能吗?还是我在这里拍摄了无法触及的东西?

PS:我没有使用Newtonsoft,无法升级我们的序列化实用程序以使用Newtonsoft

C# 反序列化 xml-namespaces

评论

0赞 dbc 11/11/2018
看起来您正在使用 not .您能否确认并分享您用于(反)序列化的代码?另外,你能共享一个完整的XML文件,而不仅仅是一个片段--即一个最小的可重现的例子吗?您将序列化为具有根元素的 XML 文档,该元素未显示在问题中。我们至少需要查看根元素名称和命名空间。DataContractSerializerXmlSerializerMyClass<MyClass>

答:

0赞 Steven Huang 11/9/2018 #1

您可以尝试直接指定命名空间,但这里有一个有效的序列化(没有 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);
        }
    }
}

这是 stdout:

<?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。