Protobuf-Net总是反序列化一个空列表

时间:2014-07-21 11:21:55

标签: c# serialization protobuf-net

以下代码显示了我如何尝试使用Protobuf-Net序列化/反序列化List。方法getNewItem()返回ItemsStore的对象,该对象将添加到列表中。

// Create an empty list
private ItemsStoreList text;

// Add some elements to the list
lock (text.SyncRoot)
{
    text.AddItem(getNewItem());
    text.AddItem(getNewItem());
    text.AddItem(getNewItem());
}

// Serialize
var file = File.Create("testfile.bin");
Serializer.Serialize<ItemsStoreList>(file, text);

// Deserialize
ItemsStoreList textNew = Serializer.Deserialize<ItemsStoreList>(file);

运行此代码后,对象textNew中包含的列表始终为空。对象textNew从类ItemsStoreList实例化,如下所示:

[ProtoContract]
public class ItemsStoreList
{
    [ProtoMember(1)]
    private List<ItemsStore> m_listData;

    private readonly object m_SyncRoot = new object();

    public ItemsStoreList()
    {
        m_listData = new List<ItemsStore>();
    }

    public void AddItem(ItemsStore item)
    {
        m_listData.Add(item);
    }

    public object SyncRoot
    {
        get { return this.m_SyncRoot; }
    }

    public int Count
    {
        get { return m_listData.Count; }
    }

    public ItemsStore getItem(int idx)
    {
        return (ItemsStore)m_listData[idx];
    }

    public void Clear()
    {
        m_listData.Clear();
    }
}

[ProtoContract]
public class ItemsStore
{
    [ProtoMember(1)]
    public myStruct m_Text;
    [ProtoMember(2)]
    public ulong m_Time;

    public ItemsStore(myStruct newText, ulong newTime)
    {
        m_Text = newText;
        m_Time = newTime;
    }

    public myStruct Text
    {
        get { return m_Text; }
    }

    public ulong Time
    {
        get { return m_Time; }
    }
}

[ProtoContract]
public struct myStruct
{
    [ProtoMember(1)]
    public uint var1;

    [ProtoMember(2)]
    public byte var2;

    [ProtoMember(3)]
    public byte[] var3;

    [ProtoMember(4)]
    public string var4;
}

1 个答案:

答案 0 :(得分:2)

我注意到的第一件事是你没有倒流;添加它(在序列化和反序列化之间)会改变行为:

file.Position = 0;

我们现在得到一个与ItemsStore构造函数有关的异常,因此我们可以指示protobuf-net完全忽略该构造函数:

[ProtoContract(SkipConstructor = true)]
public class ItemsStore

现在我们收到3件物品:

System.Console.WriteLine(textNew.Count);

输出:

3

进一步探测表明,它最有可能获取其他数据:

for (int i = 0; i < textNew.Count; i++)
{
    var item = textNew.getItem(i);
    System.Console.WriteLine(item.m_Text.var1);
    System.Console.WriteLine(item.m_Time);
}
然而,我会添加关于可变结构和公共领域的强制性警告。