我刚刚从r249更新到r282。除了替换dll,我没有做任何改变。不幸的是,现在反序列化在更新之前创建的对象需要更长的时间。过去需要两秒钟的时间现在需要五分钟。
版本之间是否存在语法更改?它有什么不再支持的吗?
我的课程都使用ProtoContract,ProtoMember和ProtoInclude。我正在运行VS2010。就我而言,我的协议缓冲区代码没有问题。我只是想升级,因为我觉得拥有最新版本是件好事。
编辑 - 2010.09.09 我的对象的一个属性是ushorts数组。我刚刚注意到这个属性没有用r282正确序列化/反序列化。结果的数组值都是零。数组在序列化之前具有值(r282),但在反序列化之后没有(r282)。
答案 0 :(得分:2)
事实证明尽管我付出了努力,但是在之前的一个版本中,数据格式发生了重大变化。这仅影响ushort
数据,这一点在处理中被省略。这是令人遗憾的,但好消息是没有数据丢失 - 它只是有点不方便访问(它基本上是通过字符串写的)。
这是我建议的解决方法;对于像这样的成员:
[ProtoBuf.ProtoMember(1)]
public ushort[] Data {get;set;}
将其替换为:
[ProtoBuf.ProtoMember(1)]
private string[] LegacyData {get;set;}
private bool LegacyDataSpecified { get { return false; } set { } }
/* where 42 is just an unused new field number */
[ProtoBuf.ProtoMember(42, Options = MemberSerializationOptions.Packed)]
public ushort[] Data { get; set; }
[ProtoBuf.ProtoAfterDeserialization]
private void SerializationCallback()
{
if (LegacyData != null && LegacyData.Length > 0)
{
ushort[] parsed = Array.ConvertAll<string, ushort>(
LegacyData, ushort.Parse);
if (Data != null && Data.Length > 0)
{
int oldLen = parsed.Length;
Array.Resize(ref parsed, parsed.Length + Data.Length);
Array.Copy(Data, 0, parsed, oldLen, Data.Length);
}
Data = parsed;
}
LegacyData = null;
}
将旧式数据导入LegacyData
并在序列化期间(之后)合并,或者从Data
写入新式数据。更快,更小,并支持旧数据和新数据。