如何使用 protobuf-net 扩展?
Posted
技术标签:
【中文标题】如何使用 protobuf-net 扩展?【英文标题】:How to use protobuf-net extensions? 【发布时间】:2010-02-07 23:20:49 【问题描述】:我已经创建了一个 .proto 文件,并且 ProtoBufTool 成功创建了 .cs 文件。我对 csharp 有点陌生,我正在尝试设置扩展字段。但不知道该怎么做?有没有人有任何示例如何使用 protobuf-net 使用扩展。
我的 .proto 文件:
package messages;
message DMsg
optional int32 msgtype = 1;
extensions 100 to max;
extend DMsg
optional string fltColumns = 101;
这是创建的类:
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//
//------------------------------------------------------------------------------
// Generated from: message.proto
namespace messages
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"DMsg")]
public partial class DMsg : global::ProtoBuf.IExtensible
public DMsg()
private int _msgtype = default(int);
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"msgtype", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)][global::System.ComponentModel.DefaultValue(default(int))]
public int msgtype
get return _msgtype;
set _msgtype = value;
private global::ProtoBuf.IExtension extensionObject;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing);
【问题讨论】:
【参考方案1】:protobuf-net 没有brilliant 对扩展的支持;您需要使用字段编号(我认为它目前对fltColumns
没有任何作用)。但是,要获取值 out,您应该能够使用 Extensible.GetValue<T>
/ TryGetValue<T>
(自我注意:在 C# 3.0 中制作这些扩展方法)。要设置一个值,请使用 AppendValue<T>
- 它无法知道这是一个单值还是一个列表 (repeated
),因此同一个 API 可以处理这两种情况。
Jon's version(更接近 Java 版本)可能在这里有更好的支持。
示例(为了简洁起见,我使用手写类,但它也应该适用于生成的类型):
static void Main()
MyData data = new MyData();
data.Id = 123;
// something we know only by field id...
Extensible.AppendValue<string>(data, 27, "my name");
string myName = Extensible.GetValue<string>(data, 27);
// this should be OK too (i.e. if we loaded it into something that
// *did* understand that 27 means Name)
MyKnownData known = Serializer.ChangeType<MyData, MyKnownData>(data);
Console.WriteLine(known.Id);
Console.WriteLine(known.Name);
[ProtoContract]
class MyData : Extensible
[ProtoMember(1)]
public int Id get; set;
[ProtoContract]
class MyKnownData
[ProtoMember(1)]
public int Id get; set;
[ProtoMember(27)]
public string Name get; set;
【讨论】:
有没有例子说明如何设置值和获取值? @VNarasimhaM - 根据请求添加Jon's Version
的链接已损坏。这是我找到的最接近的:github.com/jskeet/protobuf-csharp-port
@JesseChisholm Jon 的东西现在迁移到了主要的 google impl(虽然变化很大):github.com/protocolbuffers/protobuf/tree/master/csharp以上是关于如何使用 protobuf-net 扩展?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 protobuf-net 处理 .proto 文件
如何使用 PrefixStyle 和 ProtoBuf-net 获得长度数?