Сериализация контракта данных для IList <T> - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть следующий код, в котором я пытаюсь сериализовать список в файл

public static void Serialize<T>(this IList<T> list, string fileName)  
{
   try
   {
      var ds = new DataContractSerializer(typeof(T));
      using (Stream s = File.Create(fileName))
          ds.WriteObject(s, list);  
   }
   catch (Exception e)
   {
      _logger.Error(e);
      throw;
   } 
} 

и получаю исключение:

Тип 'Система.Collections.Generic.List`1 [[ MyClass , MyNameSpace , версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] 'с именем контракта данных' ArrayOf * MyClass *: http://schemas.datacontract.org/2004/07/MyNameSpace' не ожидается.Попробуйте использовать DataContractResolver или добавить любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, передаваемых в DataContractSerializer.

[KnownType(typeof(MyClass))]
[DataContract]
public class MyClass
{
    #region Properties
    [DataMember]
    public string Foo{ set; get; }
    [DataMember]
    public string Bar{ set; get; }
}

Есть идеи?

Наследства нет.

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

Произошло то, что сериализатор ожидает экземпляр T, а не список T, поэтому вы хотите, чтобы ваш метод был таким:

public static void Serialize<T>(this IList<T> list, string fileName)  
{
   try
   {
      var ds = new DataContractSerializer(list.GetType());
      using (Stream s = File.Create(fileName))
        ds.WriteObject(s, list);  
   }
   catch (Exception e)
   {
     _logger.Error(e);
     throw;
   } 
} 
0 голосов
/ 27 сентября 2011

попробуйте вместо этого:

var ds = new DataContractSerializer (typeof (T []));

0 голосов
/ 27 сентября 2011

Как и предполагалось, сериализатор должен быть для списка, а не для типа элементов.

Кроме того, [KnownType(typeof(MyClass))] должен принимать класс, унаследованный от MyClass в параметре, а не сам MyClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...