【问题标题】:Sending protobuf serialized object from c# to java server not working?将 protobuf 序列化对象从 c# 发送到 java 服务器不起作用?
【发布时间】:2014-04-21 23:55:03
【问题描述】:

我有一个简单的 c# 客户端应用程序,它将对象发送到基于 java 的服务器应用程序。 注意:我在 clinet 端使用 protobuf-net。对于这个应用程序,我有一个只有一个字段的简单 .proto 文件,并且 .java 类是由 protoc 编译器生成的。

.proto 文件:

 message Person {  
 required string  id = 1;       
}

C#客户端发送对象

MemoryStream ms = new MemoryStream();
            Person per = new Person();            
            per.id = "TestId001";           
            Serializer.Serialize<Person>(ms, per);
            byte[] buffer = ms.ToArray();
            clientSocket.SendTo(buffer, hostEP);

基于 Java 的服务器接收对象

DataInputStream inputStream=new DataInputStream(socket.getInputStream());    
Person person = Person.parseFrom(socket.getInputStream());                          
System.out.println("Id:  " + person.getId());

问题:我没有收到 c# 应用程序发送的序列化消息。即使我没有收到 任何错误。这就是为什么我无法找出问题所在。

【问题讨论】:

  • 您是否在客户端类中添加了 ProtoContract 和 ProtoParam 属性?
  • 包含你在 C# 和 Java 中使用的 Person 类,并告诉我们在 inputStream 中收到的值。

标签: c# java sockets serialization protobuf-net


【解决方案1】:

“问题:我没有收到序列化消息”

听起来就像经典的“套接字是流”问题(这里的第二个例子:http://marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html)。如果您已将数据写入流但尚未关闭该流,则接收流不会终止。它也不会自动知道客户端发送(比如说)应该被视为单个消息的 117 个字节。你有两个选择:

  • 写完后关闭outbound stream(只适合发送单条消息,不适合两个节点继续讨论)
  • 引入某种形式的 - 例如长度前缀 - 以便接收者知道只尝试读取一定数量的数据,而不是尝试读取到 EOF(这将如果您还没有关闭出站流,就永远不要来)

注意:除了“套接字是流”问题之外,还要记住 protobuf 消息是可附加的。 protobuf 消息本身不知道它在哪里结束。幸运的是,上面两个现有的要点都可以解决这个问题。但重要的是,你不能只在一帧中将 3 个Person 对象写入流(或关闭流),然后期望能够在另一端取回 3 个Person 对象:你会得到 一个 Person 对象。在 this 场景中,最简单的选择是添加一个包装对象,即

message SomeMessage {  
 repeated Person people = 1;       
}

【讨论】:

    【解决方案2】:

    尝试在 C# 中将这些属性添加到您的类中,并检查 Java 中的输入是否正常。

       [ProtoContract]
        class Person 
        {
         [ProtoMember(1)] 
         public string  id = "1";       
        }
    

    【讨论】:

    • 我强烈怀疑这个问题其实和protobuf无关根本...
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2013-06-11
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多