我有 .Net Client 和 .Net Server ,他们正在使用 protobuf-net 进行通信。现在,我必须创建一个 Java客户端与 .Net Server 进行通信,并且必须使用 google protobuf ,但是我遇到了一个问题:
protobuf-net 在对象反序列化期间失败,该对象是通过 google protobuf , protobuf-net从 Java客户端发送的对象显示下一个错误:“找不到ProtobufClasses.BasePage的无参数构造函数”,但是如果我通过 protobuf-net 从 .Net Client 发送相同的对象,则一切作品。失败的原因:发生这种情况的原因是抽象类型。
请注意:我完全无法触摸服务器的代码
这是整个结构的一个小例子:
服务器类:
[ProtoContract]
public class LoginPage : BasePage
{
[ProtoMember(2)]
public sting Name { get; set; }
}
[ProtoContract]
[ProtoInclude(100, typeof(LoginPage))]
public abstract class BasePage
{
[ProtoMember(1)]
public int Id { get; set; }
}
.proto 文件的示例:
message LoginPage
{
string Name = 2;
}
message BasePage
{
oneof subtype
{
LoginPage LoginPage = 100;
}
int32 Id = 1;
}
场景N1 ( protobuf-net -> protobuf-net )
var obj = new LoginPage();
byte[] array = null;
//Serializing to array
using (var memoryStream = new MemoryStream())
{
Serializer.Serialize(memoryStream, obj);
array = memoryStream.ToArray();
}
LoginPage obj2;
//Deserializing from array
using (var stream = new MemoryStream(array))
{
obj2 = Serializer.Deserialize<LoginPage>(stream);
}
一切正常
场景N2 ( protobuf-net -> google protobuf -> protobuf-net )
//xxxNN - means [protobuf-net] object
//xxxGG - means [google protobuf] object
var objNN = new LoginPage();
byte[] arrayNN = null;
//Serializing via [protobuf-net] to array
using (var memoryStream = new MemoryStream())
{
Serializer.Serialize(memoryStream, objNN);
arrayNN = memoryStream.ToArray();
}
Protobuf.BasePage objGG = null;
//Deserializing to [google protobuf] from [protobuf-net] array
using (var stream = new MemoryStream(arrayNN))
{
objGG = Protobuf.BasePage.Parser.ParseFrom(stream);
}
byte[] arrayGG = null;
//Serializing via [google protobuf] to array
using (var stream = new MemoryStream())
{
objGG.WriteTo(stream);
arrayGG = stream.ToArray();
}
LoginPage objN;
//Deserializing to [protobuf-net] from [google protobuf] array
using (var stream = new MemoryStream(arrayGG))
{
objN = Serializer.Deserialize<LoginPage>(stream); // Exception will be shown
}
存在异常: “找不到Protobuf.BasePage的无参数构造函数”
它有可能与 protobuf-net 一起使用但不能与 google protobuf 一起使用吗?以及如何避免呢?请注意,我无法更改服务器的代码。