net总是反序列化一个空列表

本文关键字:一个 列表 反序列化 net | 更新日期: 2023-09-27 18:13:46

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

// 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;
}

net总是反序列化一个空列表

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

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);
}

但是,我将添加关于可变结构和公共字段的强制性警告。