2015-05-12 88 views
0

我在使用协议缓冲区2.6.1和Java 1.7.0.71。编译java类协议缓冲区有编译时错误

和编译好的简单测试协议缓冲文件。

option java_package = "my.sample"; 
option java_outer_classname = "Sum"; 
option java_generic_services = true; 
option java_generate_equals_and_hash = true; 
option optimize_for = SPEED; 
message SumRequest { 
    required string family = 1; 
    required string column = 2; 
} 

message SumResponse { 
    required int64 sum = 1 [default = 0]; 
} 

service SumService { 
    rpc getSum(SumRequest) 
    returns (SumResponse); 
} 

但在下面的代码,memoizedHashCode是无处申报,所以它抛出编译错误。

@java.lang.Override 
public int hashCode() { 
    if (memoizedHashCode != 0) { 
    return memoizedHashCode; 
    } 
    int hash = 41; 
    hash = (19 * hash) + getDescriptorForType().hashCode(); 
    if (hasFamily()) { 
    hash = (37 * hash) + FAMILY_FIELD_NUMBER; 
    hash = (53 * hash) + getFamily().hashCode(); 
    } 
    if (hasColumn()) { 
    hash = (37 * hash) + COLUMN_FIELD_NUMBER; 
    hash = (53 * hash) + getColumn().hashCode(); 
    } 
    hash = (29 * hash) + getUnknownFields().hashCode(); 
    memoizedHashCode = hash; 
    return hash; 
} 

我在网上看到,添加

private int memoizedHashCode = 0 

解决了这个问题,但是这是我认为只是解决方法。

这是怎么发生的?

回答

2

memoizedHashCode在基类AbstractMessageLite中定义,该基类是protobuf库的一部分。

您需要确保您用于生成代码的protoc版本与您带入程序的版本libprotobuf.jar完全相符。如果版本不匹配,则可以看到您描述的错误以及其他错误。