如果有抽象类,则protobuf-net无法从Google protobuf反序列化

时间:2019-08-16 15:52:58

标签: c# protocol-buffers protobuf-net

我有 .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 一起使用吗?以及如何避免呢?请注意,我无法更改服务器的代码。

0 个答案:

没有答案