提问人:st0ve 提问时间:11/7/2018 最后编辑:st0ve 更新时间:11/9/2018 访问量:191
枚举的 HashSet 的 XML 命名空间
XML Namespace for HashSet of Enums
问:
我很难反序列化枚举的 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
答:
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。
评论
DataContractSerializer
XmlSerializer
MyClass
<MyClass>