Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将protoBuf网络消息序列化到流c“getting error”;“只能处理数据协定类”;_C#_Serialization_Protocol Buffers_Protobuf Net - Fatal编程技术网

C# 将protoBuf网络消息序列化到流c“getting error”;“只能处理数据协定类”;

C# 将protoBuf网络消息序列化到流c“getting error”;“只能处理数据协定类”;,c#,serialization,protocol-buffers,protobuf-net,C#,Serialization,Protocol Buffers,Protobuf Net,protoBuf中有一条消息称为“package”,我将.proto文件生成到类中,目的是填充“package”中所有必需的字段,它工作正常。 现在,我有一个名为“package”的protoBuf消息实例,我想将其序列化为一个流,然后将其输出到一个文件 byte[] data; using (var ms = new MemoryStream()) {

protoBuf中有一条消息称为“package”,我将.proto文件生成到类中,目的是填充“package”中所有必需的字段,它工作正常。 现在,我有一个名为“package”的protoBuf消息实例,我想将其序列化为一个流,然后将其输出到一个文件

                    byte[] data;
                    using (var ms = new MemoryStream())
                    {
                        Serializer.Serialize<repo_package.Package.Builder>(ms, package);
                        data = ms.ToArray();
                    }
                    string packageFilePath = Path.Combine("C:\\1", package.Name);
                    File.WriteAllBytes(packageFilePath, data);
byte[]数据;
使用(var ms=new MemoryStream())
{
序列化器。序列化(ms,包);
data=ms.ToArray();
}
字符串packageFilePath=Path.Combine(“C:\\1”,package.Name);
File.writealBytes(packageFilePath,数据);
问题是我调用“Serializer”函数时出错,错误是

“只能处理数据协定类(及其列表/数组)”

为什么呢? 如何将包(protobuf消息)输出到文件

谢谢,


猎户座。

这看起来像是图书馆的交叉;如果您的DTO是
Package
,则
Package.Builder
的存在强烈表明您正在使用Jon Skeet的
protobuf csharp端口
实现中的代码生成工具。这很好,但是通过
protobuf csharp端口
生成的代码预计将与
protobuf csharp端口
库一起使用,这可能意味着“在DTO实例上使用
WriteTo
方法”

protobuf-net
是同一序列化协议的一个完全独立的实现;它有单独的代码生成工具(无可否认,两者都涉及称为
protogen
protoc
的工具,这可能会有点混淆)。如果使用
protobuf-net
版本的
protogen
,它将输出与
protobuf-net
库一起工作的代码(为了完整性,对于
protobuf-net
来说,通常先使用代码,而不涉及
.proto
文件,但完全支持合同优先
.proto
使用)

因此,要么:

  • 坚持使用
    protobuf csharp端口
    代码生成,然后切换到
    protobuf csharp端口
    运行时,或者:
  • 坚持使用
    protobuf-net
    运行时,并切换到
    protobuf-net
    代码生成

问题可能是您没有使用适当的属性修饰类……例如:[ProtoContract]和[ProtoMember(1)]…您能介绍一下
Builder
?请注意,除了@jsobo的评论之外,还有其他不需要属性的方法来配置模型,但关键是您需要以某种方式配置系统。最简单的方法是属性,但您也可以使用运行时代码告诉它您希望它做什么@jsobo我需要在哪里添加装饰?@Marc_Gravell,从.proto文件生成的.cs文件很大,并且不是所有的代码都是可以理解的。@Orionlk right;您有一个从.proto生成的文件-这是一个很好的开始。现在:您使用了什么工具来生成代码?如果它是protobuf net工具,那么它应该可以工作。我会非常高兴有兴趣知道它不是。那么:你用什么把.proto转换成.cs?我怀疑你可能使用了Jon实现中的工具,但是我的库。谢谢@Marc_Gravell,我理解我的错误,我坚持使用protobuf网络实例和函数,现在它工作得很好。