c# - Protobuf-net r282 在反序列化使用 r249 序列化的对象时出现问题

标签 c# protobuf-net

我刚刚从 r249 更新到 r282。除了替换 dll 之外,我没有做任何更改。不幸的是,现在反序列化更新之前创建的对象需要更长的时间。过去需要两秒钟的时间现在需要五分钟。

版本之间是否有语法变化?有什么它不再支持的吗?

我的类(class)都在使用 ProtoContract、ProtoMember 和 ProtoInclude。我正在运行 VS2010。就我而言,我的 Protocol Buffer 代码没有问题。我只是想升级,因为我认为拥有最新版本是件好事。

编辑 - 2010.09.09 我的对象的属性之一是一组 ushorts。我刚刚注意到此属性没有使用 r282 正确序列化/反序列化。数组的结果值全为零。该数组在序列化 (r282) 之前有值,但在反序列化 (r282) 之后没有。

最佳答案

事实证明,尽管我做出了努力,是的,在早期版本之一的数据格式中发生了重大变化。这只会影响 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;
}

这会将old-style 数据导入LegacyData 并在(之后)序列化期间将其合并,或者从写入new-style 数据>数据。更快、更小,并支持新旧数据。

关于c# - Protobuf-net r282 在反序列化使用 r249 序列化的对象时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3672777/

相关文章:

c# - 请推荐.NET ORM进行N层开发

c# - 在 C# 中将 COM 对象作为参数传递

c# - 使用 protobuf-net 动态反序列化基于类型变量的类

当集合是另一种类型的属性时,Protobuf-net将空集合反序列化为null

c# - 如何列出我的解决方案中的所有 DLL 并获取其版本?

c# - 当一个为空时比较整数和默认比较为真

c# - SoapHttpClientProtocol 和 TLS 1.2 - 客户端和服务器无法通信,因为它们不具备通用算法

c# - 我在反序列化过程中遇到下一个异常 : "Invalid field in source data: 0". 如何找出源代码中的原因/错误位置?

c# - Protocol Buffers NET 序列化 SortedDictionary<CustomTKey, CustomTValue>?

c# - protobuf-net AddField 忽略 IgnoreListHandling