gpt4 book ai didi

protocol-buffers - Protocol Buffer 是否支持具有共享引用的对象图的序列化?

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

请注意以下简单程序(基于 protobuf-net 项目 v1 wiki 中的示例):

using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using ProtoBuf;

namespace HelloProtoBuf
{
[ProtoContract]
class Person
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public Address Address { get; set; }
}
[ProtoContract]
class Address
{
[ProtoMember(1)]
public string Line1 { get; set; }
[ProtoMember(2)]
public string Line2 { get; set; }
}


class Program
{
static void Main(string[] args)
{
var person = new Person
{
Id = 12345,
Name = "Fred",
Address = new Address
{
Line1 = "Flat 1",
Line2 = "The Meadows"
}
};
var person2 = new Person
{
Id = 4553,
Name = "Nadya",
Address = person.Address
};
var persons = new List<Person> { person, person2 };
Debug.Assert(ReferenceEquals(persons[0].Address, persons[1].Address));

using (var file = File.Create("persons.bin"))
{
Serializer.Serialize(file, persons);
}
List<Person> persons2;
using (var file = File.OpenRead("persons.bin"))
{
persons2 = Serializer.Deserialize<List<Person>>(file);
}
Debug.Assert(ReferenceEquals(persons2[0].Address, persons2[1].Address));
}
}
}

第二个断言失败。这是 protobuf-net 实现中的错误还是 Protocol Buffer 根本不支持具有共享引用的对象图?

谢谢。

最佳答案

Protocol Buffer 本身不支持这一点 - 所以不,这不是一个错误。确实,XmlSerializerDataContractSerializer * 会做同样的事情(JavaScriptSerializer 和 JSON.NET 可能也是如此)。

但是,这是一个普通的请求,所以这个 protobuf-net v2 支持 (基本上:我作弊)。只需将其更改为:

    [ProtoMember(3, AsReference=true)]
public Address Address { get; set; }

(并使用我在大约 5 分钟内上传的 v2 dll,或从代码构建)

*=警告: DataContractSerializer确实支持引用,但前提是您使用特定的构造函数;默认情况下它是禁用的

关于protocol-buffers - Protocol Buffer 是否支持具有共享引用的对象图的序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6063729/

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