protobuf-net не сериализовать List‹T›

Я пытаюсь сериализовать List<T>, но получаю пустой файл, а List<T> не сериализуется. Я не получаю никаких исключений и читаю руководство protobuf-net, все элементы, которые я хочу сериализовать, отмечены атрибутами [ProtoContract] и [ProtoMember]

public void Save()
{
    using (var outputStream = File.Create(SettingsModel.QueueListDataFile))
    {      
        Serializer.Serialize(outputStream, QueueList);
    }
}

[Serializable]
[ProtoContract]
public class QueueList : SafeList<QueueItem>
{

}

[Serializable]    
[ProtoContract]
public class SafeList<T> : SafeLock
{
    [ProtoMember(1)]
    private static readonly List<T> ItemsList = new List<T>();
}

[Serializable]
[ProtoContract]
public class QueueItem
{
    [ProtoMember(1)]
    public string SessionId { get; set; }
    [ProtoMember(2)]
    public string Email { get; set; }
    [ProtoMember(3)]
    public string Ip { get; set; }
}

person Tomas    schedule 27.11.2012    source источник


Ответы (1)


protobuf-net не смотрит на статические данные; ваши основные данные:

private static readonly List<T> ItemsList = new List<T>();

Насколько я знаю, ни один сериализатор на это не посмотрит. Сериализаторы основаны на объектах; их интересуют только значения экземпляра объекта. Кроме того, есть проблема наследования — вы не определили его для модели, поэтому смотрите на каждую отдельно.

Следующее работает нормально, но, честно говоря, я подозреваю, что было бы разумно упростить здесь модель DTO; что-то столь же простое, как список элементов, не должно включать 3 уровня иерархии... на самом деле, оно не должно включать каждый - List<T> работает прекрасно.


using ProtoBuf;
using System;
using System.Collections.Generic;
using System.IO;
static class Program
{
    public static void Main()
    {
        using (var outputStream = File.Create("foo.bin"))
        {
            var obj = new QueueList { };
            obj.ItemsList.Add(new QueueItem { Email = "[email protected]" });
            Serializer.Serialize(outputStream, obj);
        }
        using (var inputStream = File.OpenRead("foo.bin"))
        {
            var obj = Serializer.Deserialize<QueueList>(inputStream);
            Console.WriteLine(obj.ItemsList.Count); // 1
            Console.WriteLine(obj.ItemsList[0].Email); // [email protected]
        }
    }
}
[Serializable]
[ProtoContract]
public class QueueList : SafeList<QueueItem>
{

}

[ProtoContract]
[ProtoInclude(1, typeof(SafeList<QueueItem>))]
public class SafeLock {}

[Serializable]
[ProtoContract]
[ProtoInclude(2, typeof(QueueList))]
public class SafeList<T> : SafeLock
{
    [ProtoMember(1)]
    public readonly List<T> ItemsList = new List<T>();
}

[Serializable]
[ProtoContract]
public class QueueItem
{
    [ProtoMember(1)]
    public string SessionId { get; set; }
    [ProtoMember(2)]
    public string Email { get; set; }
    [ProtoMember(3)]
    public string Ip { get; set; }
}
person Marc Gravell    schedule 27.11.2012