【问题标题】:protobuf-net OverwriteList on Byte Array字节数组上的 protobuf-net OverwriteList
【发布时间】:2012-02-04 17:26:43
【问题描述】:

我正在尝试通过 protobuf-net 发送一个 IPEndpoint,我观察到的是,当将 4 个字节的数组反序列化为 IP4 地址时,设置代码收到一个 8 个字节的值。四个字节包含原始地址,另外 4 个字节包含被序列化的地址。通过单步执行代码,我能够确认在调用 Deserialize 时,它​​首先读取字节,然后设置它们的字节。

在阅读了一些内容后,我了解了 OverwriteList,如下例所示,我已将其设置为 true。然而,setter 仍然提供了一个 8 字节的值。

有人知道我做错了什么吗?

当与 protobuf-net r480、Visual Studio 2010 作为 .Net 4.0 控制台应用程序一起使用时,此示例代码应引发异常。

使用 ProtoBuf; 使用 System.Net; 使用 System.IO; 命名空间 ConsoleApplication1 { [原合同] 类地址所有者 { 私有 IPEndPoint 端点; 公共地址所有者() {端点=新IPEndPoint(新IPAddress(新字节[] {8,8,8,8}),0); } 公共地址所有者(IPEndPoint 新端点) { this.endpoint = newendpoint; } [ProtoMember(1, OverwriteList=true)] 公共字节 [] 地址字节 { 获取 { 返回端点.Address.GetAddressBytes(); } 设置{端点.地址=新IP地址(值); } } } 课堂节目 { 静态无效主要(字符串 [] 参数) { AddressOWner ao = new AddressOWner(new IPEndPoint(new IPAddress(new byte[] { 192, 168, 1, 1 }), 80)); 内存流毫秒 = 新的内存流(); Serializer.Serialize(ms, ao); byte[] messageData = ms.GetBuffer(); ms = new MemoryStream(messageData); AddressOWner aoCopy = Serializer.Deserialize(ms); } } }

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    看起来这实际上是一个错误,特定于 byte[],它被作为特定的 protobuf 原语处理。其他数组/列表映射到repeated(以protobuf 术语),并正确处理OverwriteList 选项。我将调整 byte[] 处理以支持此选项。

    编辑:这在 r484 中已修复,支持 integration test

    【讨论】:

    • 我尝试从源代码构建,我认为我成功了,但我创建的 dll 仍然具有相同的行为。有发布时间表吗?我现在的工作是在属性设置器期间将正确的字节复制到一个新数组中。
    • @William 在我验证了其他一些修复后。
    • 我正在使用来自 Nuget 的 2.0.0.480 版本,其中包含此错误。如果有更新的软件包可用,或者至少有某种解决方法,那就太好了。
    • @Josef 是的,有点落后;后备箱在 r560 上。我有一个潜在的回归需要解决,但我会尽快部署。
    • 在使用 8 字节数组时,protobuf-net 版本 2.0.0.640 中是否存在这种可能性?它在反序列化时生成 16 个字节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多