gpt4 book ai didi

protobuf-net 保留 future 领域

转载 作者:行者123 更新时间:2023-12-04 14:45:30 32 4
gpt4 key购买 nike

我现在为此进行了一些搜索,但无法确定 protobuf-net 或 protobuf 通常是否支持以下意义上的前向兼容性:

旧版本的对象使用新字段反序列化新版本的对象,但在将其序列化回时保留该字段,因此新版本的对象不会丢失该值。

protobuf 可以做到这一点吗?

非常感谢

最佳答案

是的;大多数 protobuf 实现都支持往返未知数据。由于您专门标记了 - 如果您使用的是代码优先(即手工编写类,这在 protobuf-net 中很常见),那么您需要明确地为此提供支持。最简单的方法是继承 Extensible 。下面显示了通过对字段一无所知的类型的成功往返:

using System;
using System.IO;
using ProtoBuf;

[ProtoContract]
class Foo
{
[ProtoMember(1)]
public int X { get;set; }
[ProtoMember(2)]
public int Y { get;set; }
}
[ProtoContract]
class Bar : Extensible
{
[ProtoMember(1)]
public int A { get;set; } // if declared, needs to be compatible

// note we don't have a declared field 2 here
}
static class Program
{
static void Main()
{
Foo orig = new Foo { X = 123, Y = 456 }, clone;
Bar bar;
using(var ms = new MemoryStream())
{
Serializer.Serialize(ms, orig);
ms.Position = 0;
bar = Serializer.Deserialize<Bar>(ms);

Console.WriteLine(bar.A); // 123 // query known data
int b = Extensible.GetValue<int>(bar, 2); // query unknown data
Console.WriteLine(b); // 456
}
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, bar);
ms.Position = 0;
clone = Serializer.Deserialize<Foo>(ms);
}
Console.WriteLine(clone.X); // 123
Console.WriteLine(clone.Y); // 456
}
}

关于protobuf-net 保留 future 领域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21331731/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com