2012-02-25 175 views
7

我在访问扩展协议缓冲区成员时遇到问题。这里是场景:Java中的扩展协议缓冲区

Message Foo { optional int i = 1; } 

message Bar { extend Foo { 
    optional int j = 10001; } } 

我没有任何其他原型中的酒吧消息。如何在Java中获得Bar.j?我发现的所有例子都需要在消息中使用Bar。

谢谢!

回答

8

协议缓冲区中的扩展并不一定像您期望的那样工作,即它们与Java继承机制不匹配。

对于你的问题,我创建了以下foobar.proto文件:

package test; 

message Foo { 
    optional int32 i = 1; 
    extensions 10 to 99999; 
} 

message Bar { 
    extend Foo { 
     optional int32 j = 10001; 
    } 
} 

它创建Foobar.java,含有类Foobar.BarFoobar.Foo

这里是一个简单的JUnit测试案例访问Bar.j:

import static org.junit.Assert.assertEquals; 
import org.junit.Test; 
import test.Foobar.Bar; 
import test.Foobar.Foo; 

public class TestFooBar { 

    @Test 
    public void testFooBar() { 
     Foo foo = Foo.newBuilder().setI(123).setExtension(Bar.j, 456).build(); 
     assertEquals(Integer.valueOf(456), foo.getExtension(Bar.j)); 
    } 
} 

希望帮助澄清您的问题!