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;
}
我注意到的第一件事是您没有倒绕流;添加这个(在序列化和反序列化之间)会改变行为:
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);
}
但是,我将添加关于可变结构和公共字段的强制性警告。