2

我正在尝试将 HashSet 序列化为以下代码。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace ConsoleApplication20
{
    class Program
    {
        static void Main(string[] args)
        {
            var sr = new DataContractSerializer(typeof(Test));
            var t = new Test();
            var mem = new MemoryStream();
            sr.WriteObject(mem, t);

        }


    }

    [DataContract]
    public class Test
    {
        [DataMember]
        public ISet<int> TestSet = new HashSet<int>();
    }
}

但是这段代码失败了:

键入“System.Collections.Generic.HashSet`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”,数据合同名称为“ArrayOfint: http://schemas.microsoft。 com/2003/10/Serialization/Arrays '不是预期的。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中

我绝对不想碰这条线:

  public ISet<int> TestSet = new HashSet<int>();

除此之外,由于某些其他原因(该类型实际上不是哈希集),我不允许 HashSet 作为这种情况下的已知类型。我应该怎么办 ?

4

2 回答 2

2

我不确定为什么会出现异常,因为将 TestSet 更改为另一种类型(如IEnumerable<int>)不会导致异常。但添加

[KnownType(typeof(HashSet<int>))]

到你的班级解决你的问题。

[DataContract]
[KnownType(typeof(HashSet<int>))]
public class Test
{
    [DataMember]
    public ISet<int> TestSet = new HashSet<int>();
}

另请参阅这篇文章以获取更多信息。

于 2013-03-19T10:07:35.730 回答
0

我建议根据您的哈希集创建一个公共属性。

public ISet<int> TestSet = new HashSet<int>();

[System.Runtime.Serialization.DataMember]
public int[] TestArray
{
    get { return TestSet.ToArray(); }
    set { TestSet = new HashSet<int>(value); }
}
于 2013-03-19T09:53:47.017 回答