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>();
    }
}

しかし、このコードは失敗します:

データ コントラクト名 '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 に答える