【发布时间】:2012-12-24 10:17:51
【问题描述】:
我正在 C# 中创建一个流并尝试在 java 中读取它,但我收到错误消息:“协议消息标记的线路类型无效。”当我在我的 java 代码中读取它时,在 c# 中创建的对象。
详情: 我从一个相等的 .proto 文件(见下文)开始创建对应的 .java 文件和 .cs 文件(使用版本“protobuf-2.4.1”中的 java 协议和 protobuf-csharp-port-2.4.1.473 进行编译-c# 的完整二进制文件)。 我成功创建了 addressbook.java 和 addressbook.cs。
对象是在 c# 中创建的,并使用以下 c# 代码写入文件:
[...]
byte[] bytes;
//Create a builder to start building a message
Person.Builder newContact = Person.CreateBuilder();
//Set the primitive properties
newContact.SetId(1)
.SetName("Foo")
.SetEmail("foo@bar");
//Now add an item to a list (repeating) field
newContact.AddPhone(
//Create the child message inline
Person.Types.PhoneNumber.CreateBuilder().SetNumber("555-1212").Build()
);
//Now build the final message:
Person person = newContact.Build();
newContact = null;
using(MemoryStream stream = new MemoryStream())
{
//Save the person to a stream
person.WriteTo(stream);
bytes = stream.ToArray();
//save this to a file (by me)
ByteArrayToFile("personStreamFromC#", bytes);
[...]
我将创建的文件“personStreamFromC#”复制到我的 java 解决方案并尝试使用以下 java 代码读取它:
AddressBook.Builder addressBook = AddressBook.newBuilder();
// Read the existing address book.
try {
FileInputStream input = new FileInputStream(args[0]);
byte[] data = IOUtils.toByteArray(input);
addressBook.mergeFrom(data);
// Read the existing address book.
AddressBook addressBookToReadFrom =
AddressBook.parseFrom(new FileInputStream(args[0]));
Print(addressBookToReadFrom);
}
但我收到以下消息:
线程“main”com.google.protobuf.InvalidProtocolBufferException 中的异常:协议消息 标签的电线类型无效。在 com.google.protobuf.InvalidProtocolBufferException.invalidWireType(InvalidProtocolBufferException.java:78) 在 com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:498) 在 com.google.protobuf.GeneratedMessage$Builder.parseUnknownField(GeneratedMessage.java:438) 在 com.example.tutorial.AddressBookProtos$Person$Builder.mergeFrom(AddressBookProtos.java:1034) 在 com.example.tutorial.AddressBookProtos$Person$Builder.mergeFrom(AddressBookProtos.java:1) 在 com.google.protobuf.CodedInputStream.readMessage(CodedInputStream.java:275) 在 com.example.tutorial.AddressBookProtos$AddressBook$Builder.mergeFrom(AddressBookProtos.java:1715) 在 com.example.tutorial.AddressBookProtos$AddressBook$Builder.mergeFrom(AddressBookProtos.java:1) 在 com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:300) 在 com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:238) 在 com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:162) 在 com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:716) 在 com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:238) 在 com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:153) 在 com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:709) 在 AddPerson.main(test.java:104)
.proto 文件下方: 包教程; 消息人{ 所需的字符串名称 = 1; 必需的 int32 id = 2; // 此人的唯一 ID 号。 可选字符串 email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
有什么想法吗??
【问题讨论】:
-
您在 C# 中将
Person对象写入文件,然后在 Java 中读取AddressBook,我认为这是不正确的。试试Person.parseFrom(new FileInputStream(args[0])); -
哇!你说的对 !!!非常感谢,它解决了问题!
-
@hoaz 您应该将其添加为答案
标签: c# java exception protocol-buffers