gpt4 book ai didi

c# - 谷歌的 Protocol Buffer 从 c# 到 java - 协议(protocol)消息标签有无效的线类型

转载 作者:行者123 更新时间:2023-11-30 22:22:02 25 4
gpt4 key购买 nike

我在 C# 中创建一个流并尝试在 java 中读取它,但我收到错误:“协议(protocol)消息标记具有无效的线路类型。”当我在我的 Java 代码中读取它时,对象是在 C# 中创建的。

详细信息:我从一个相等的 .proto 文件(见下文)开始创建相应的 .java 文件和 .cs 文件(使用版本“protobuf-2.4.1”中的 java 协议(protocol)和 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);
}

但我收到以下消息:

Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: Protocol message tag had invalid wire type. at com.google.protobuf.InvalidProtocolBufferException.invalidWireType(InvalidProtocolBufferException.java:78) at com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:498) at com.google.protobuf.GeneratedMessage$Builder.parseUnknownField(GeneratedMessage.java:438) at com.example.tutorial.AddressBookProtos$Person$Builder.mergeFrom(AddressBookProtos.java:1034) at com.example.tutorial.AddressBookProtos$Person$Builder.mergeFrom(AddressBookProtos.java:1) at com.google.protobuf.CodedInputStream.readMessage(CodedInputStream.java:275) at com.example.tutorial.AddressBookProtos$AddressBook$Builder.mergeFrom(AddressBookProtos.java:1715) at com.example.tutorial.AddressBookProtos$AddressBook$Builder.mergeFrom(AddressBookProtos.java:1) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:300) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:238) at com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:162) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:716) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:238) at com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:153) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:709) at 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,我不知道不认为这是正确的。尝试在您的 Java 代码中执行以下操作:

Person.parseFrom(new FileInputStream(args[0]));

关于c# - 谷歌的 Protocol Buffer 从 c# 到 java - 协议(protocol)消息标签有无效的线类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14019966/

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