gpt4 book ai didi

c# - Protobuf.NET 使用

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:06 26 4
gpt4 key购买 nike

需要在托管 C# 和非托管 C++ 之间发送一些数据。经过一番研究我尝试使用 Protobuf.NET。

我不确定我是否理解 ProtoBuf 的功能......

  1. 在 Proto 中构建类型定义。我在 c++ 和 c# 项目中都需要这种类型定义
  2. 使用命令行工具“protogen.exe”从类型定义中获取.cs文件和.cpp、.h
  3. 将 .cs 文件复制到我的 C# 项目中,并将 .cpp、.h 复制到我的 C++ 解决方案中。

看来我太蠢了,无法解决这个问题。这是我的问题。

  1. 是否可以在 c# 中定义类型以在 for c++ 中生成文件?
  2. 尝试对以下文件使用命令行工具 protogen.exe

测试1.proto

using ProtoBuf;
namespace ProtocolBuffers
{
[ProtoContract]
class Person
{
[ProtoMember(1)]
public int Id {get;set;}
[ProtoMember(2)]
public string Name { get; set; }
}
}

测试2.proto

message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}

什么都不适合我。真的什么都试过了。我将原型(prototype)文件放入命令行目录,尝试了每个选项来设置目录。如何轻松构建它们?第二个文件与标准的 proto 命令行工具一起用于 c++,但我也需要它用于 c#。真的需要你的帮助。

最佳答案

首先,请注意 protobuf-net 只是 .NET 的一个可用实现;无论如何...

“test1.proto”不是 .proto - 它是 C#;与 protobuf-net 一起使用时,.proto 不是必需的,但在您的互操作场景中,这是一个非常好的主意。有用于此的 VS2010 插件,或者 protobuf-net zip 中的 protogen 工具:

 protogen -i:test2.proto -o:test2.cs

这应该生成包含以下内容的 test2.cs:

//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

// Generated from: test2.proto
namespace test2
{
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"Person")]
public partial class Person : global::ProtoBuf.IExtensible
{
public Person() {}

private int _id;
[global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"id", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
public int id
{
get { return _id; }
set { _id = value; }
}
private string _name;
[global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)]
public string name
{
get { return _name; }
set { _name = value; }
}

private string _email = "";
[global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"email", DataFormat = global::ProtoBuf.DataFormat.Default)]
[global::System.ComponentModel.DefaultValue("")]
public string email
{
get { return _email; }
set { _email = value; }
}
private global::ProtoBuf.IExtension extensionObject;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
{ return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
}

}

请注意,如果您需要,还有其他开关,例如,它会尝试大小写规范化(因此您会得到 IdNameEmail 等),或者希望它包含额外的序列化程序支持(BinaryFormatterDataContractSerializer 等)

关于c# - Protobuf.NET 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6771444/

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