Сериализация DataContract для HashSet

Я пытаюсь сериализировать 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, Версия =4.0.0.0, Culture= нейтральный, PublicKeyToken=b77a5c561934e089]]' с именем контракта данных 'ArrayOfint: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'не ожидается. Рассмотрите возможность использования DataContractResolver или добавьте любые типы, которые не известны статически, в список известных типов.

Я определенно не хочу касаться этой строки:

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

В дополнение к этому по какой-то другой причине (тип на самом деле не hashset) мне не разрешают HashSet в качестве известного типа для этого случая. Что я должен делать?

2 ответа

Я не уверен, почему вы получаете исключение, потому что изменение TestSet на другой тип (например, IEnumerable<int>) не приведет к исключению. Но добавляя

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

в вашем классе решает вашу проблему.

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

Смотрите также этот пост для получения дополнительной информации.

Я бы предложил создать публичную собственность на основе вашего хэшсета.

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

[System.Runtime.Serialization.DataMember]
public int[] TestArray
{
    get { return TestSet.ToArray(); }
    set { TestSet = new HashSet<int>(value); }
}
Другие вопросы по тегам