Protocol buffers 协议缓冲区是否支持具有共享引用的对象图的序列化?

Protocol buffers 协议缓冲区是否支持具有共享引用的对象图的序列化?,protocol-buffers,protobuf-net,Protocol Buffers,Protobuf Net,请遵守以下简单程序(基于protobuf net project v1 wiki中的示例): 使用System.Collections.Generic; 使用系统诊断; 使用System.IO; 使用ProtoBuf; 名称空间HelloProtoBuf { [原始合同] 班主任 { [原成员(1)] 公共int Id{get;set;} [原成员(2)] 公共字符串名称{get;set;} [原成员(3)] 公共广播地址{get;set;} } [原始合同] 班级地址 { [原成员(1)] 公

请遵守以下简单程序(基于protobuf net project v1 wiki中的示例):

使用System.Collections.Generic;
使用系统诊断;
使用System.IO;
使用ProtoBuf;
名称空间HelloProtoBuf
{
[原始合同]
班主任
{
[原成员(1)]
公共int Id{get;set;}
[原成员(2)]
公共字符串名称{get;set;}
[原成员(3)]
公共广播地址{get;set;}
}
[原始合同]
班级地址
{
[原成员(1)]
公共字符串Line1{get;set;}
[原成员(2)]
公共字符串第2行{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
var person=新的人
{
Id=12345,
Name=“Fred”,
地址=新地址
{
Line1=“平面1”,
Line2=“草地”
}
};
var person2=新员工
{
Id=4553,
Name=“Nadya”,
地址=人。地址
};
var persons=新列表{person,person2};
Assert(ReferenceEquals(个人[0]。地址,个人[1]。地址));
使用(var file=file.Create(“persons.bin”))
{
序列化器。序列化(文件、人员);
}
名单人员2;
使用(var file=file.OpenRead(“persons.bin”))
{
persons2=序列化程序。反序列化(文件);
}
Assert(ReferenceEquals(persons2[0]。地址,persons2[1]。地址));
}
}
}
第二个断言失败。这是protobuf网络实现中的一个错误,还是协议缓冲区根本不支持具有共享引用的对象图

谢谢。

协议缓冲区本身不支持此功能-因此不,这不是一个bug。实际上,
XmlSerializer
DataContractSerializer
*也会这样做(可能
JavaScriptSerializer
和JSON.NET也是如此)

但是,这是一个常见的请求,因此protobuf net v2支持此(基本上是:我作弊)。只需将其更改为:

    [ProtoMember(3, AsReference=true)]
    public Address Address { get; set; }
(并使用我在大约5分钟内上传的v2 dll,或从代码构建)



*=警告:
DataContractSerializer
不支持引用,但仅当您使用特定构造函数时;默认情况下是禁用的

是否可以通过命令式模型(RuntimeTypeModel)传递此信息?问题是,我的代理使用DataContract/DataMember进行属性化,以避免引用protobuf net。谢谢。@mark-是的<代码>元类型[3]。AsReference=true,其中
3
是字段号(
Order=3
,用DCS的说法),那么Marc,这个图形序列化在幕后是如何工作的呢?您是否为每个引用的对象创建隐藏的int-id(如代理主键),然后在加载时还原它们?@Lone是的,正是这样-仅针对标记用于此用途的关系,尽管如此。本周末,我将尝试将其用于Ludem Dare()的快速而肮脏的序列化程序。需要很多很棒的忍者工具,就像你在这里制作的一样!
    [ProtoMember(3, AsReference=true)]
    public Address Address { get; set; }