以下代码显示了我如何尝试使用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;
}
答案 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);
}
然而,我会添加关于可变结构和公共领域的强制性警告。