3

我从昨天开始学习谷歌协议缓冲区并且有一个问题:

我可以使用用户定义的 java 类作为 .proto 文件中的字段类型吗?

让我用以下细节澄清我的问题:

1 - 我有以下 java 类“MyComplexClass.java”:

package mypackage;

import another.package1.ClassA;
import another.package2.ClassB;

public class MyComplexClass {

private ClassA var1;
private ClassB var2;

public MyComplexClass(ClassA X, ClassB Y)
 this.var1 = X;
 this.var2 = Y;
}

2-现在我想序列化“MyComplexClass.java”类的一个实例。为此,我想在 .proto 文件中描述如下消息:

message myMessageToBeSerialized {

 required ***MyComplexClass*** intanceOfComplexClass = 1;

}

是否可以使用用户定义的类MyComplexClass作为字段类型?还是只允许使用标量类型?

任何帮助,将不胜感激。提前致谢。

贺拉斯

4

3 回答 3

3

不可以。只能使用定义为协议缓冲区的类型。(也就是说,当您需要添加更多功能时,通常将您自己的复杂类实现为协议缓冲区类的包装器。)

如果您真的非常热衷于它,您可以使用普通的 Java 序列化(ObjectOutputStream包裹在 a 周围ByteArrayOutputStream),然后通过协议缓冲区发送 byte[]。

于 2012-04-19T14:20:57.223 回答
1

是的你可以。将 ClassA 和 ClassB 都定义为消息,您可以将它们称为 MyComplexClass 中的字段类型。见下文。(在单独的 .proto 文件中定义所有 3 个包)

package another.package1;
message ClassA 
{
  <fields>
}


package another.package2;
message ClassB
{
  <fields>  
}


package mypackage;

import another/package1/ClassA;
import another/package2/ClassB;

message MyComplexClass
{
     required ClassA var1 = 1;
     required ClassB var2 = 2;  
}
于 2012-07-19T14:02:14.850 回答
0

只需定义一个代理类来实现从协议缓冲区类到您的类的转换,反之亦然。

于 2012-04-19T14:21:38.360 回答