Сериализация 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); }
}