2015-05-12 123 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完全相符。如果版本不匹配,則可以看到您描述的錯誤以及其他錯誤。