2013-04-21 53 views
2

我已經從google protobuf v。2.4.1遷移到v 2.5.0(沒有其他更改)。Protobuf 2.5.0錯誤?

我有一個使用2.4.1的完美的客戶端服務器[gae dev服務器]通信。
現在與2.5.0它已經壞了。

沒有對.proto文件進行任何修改,我已經用新的2.5.0 jar安裝了我的客戶端和服務器,並且使用新的protoc可執行文件,我爲客戶端和服務器生成了一個新的源文件原型文件。

現在,我得到當我試圖解析郵件的服務器上此錯誤:

VerifyError: class ... overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet; 

完整的堆棧:

java.lang.VerifyError: class com.mta.pb.ACM$MyRequest overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet; 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:213) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:186) 
at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70) 
at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:64) 
**at com.mta.server.p.AndroidServletP.doPost(AndroidServletP.java:91)** <- my code 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:57) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    ...etc 

事情我已經嘗試:

1)閱讀更新日誌,我試圖改變解析代碼:

  request = MyRequest.parseFrom(requstBlob); 

  request = MyRequest.PARSER.parseFrom(requstBlob); 

(這是同線91,你在堆棧跟蹤看到)。
它沒有改變一件事。同樣的錯誤。

2)我試圖解析手動消息:
我打印出的base64串來給服務器,將其轉換成二進制

base64 -d in64 > out64.bin 

protoc --decode=MyRequest my.proto <out64.bin> tmp.txt 

而且它完美地解析它。 所以問題只出現在新protobuf的解析部分。

3)我試過把ReqType從MyRequest中取出,沒有效果。

參考:相關的protobuf定義

/** 
* Master request object 
*/ 
message MyRequest { 
    optional RequestContext context = 1; 
    optional MyReport myReport = 2; 
    optional CategoryRequest catRequest = 3; 
    optional GetMessage getMessage = 4; 
    optional SearchRequest searchRequest = 5; 
    enum ReqType { 
     UNDEFINED = 1; 
     REGISTER = 104; 
     UPDATE = 123; 
     GET_PAYLOAD = 100; 
     SEARCH = 200; 
     REPEAT_GCM = 623; 
     REPEAT_PREPARE = 842; 
    } 
    optional ReqType reqType = 10; 
    optional bool repeat = 11; 
} 

任何意見,將不勝感激!

+0

幾個小時的無果研究我已經回到2.4.1,並且它再次工作。 – auval 2013-04-21 17:04:02

回答

6

我想你沒有升級/重新編譯的東西。在protobuf 2.4.1版本int罐子。

GeneratedMessage

getUnknownFields是一個最後的方法在2.4.1但在2.5.0它變爲:

//@Override (Java 1.6 override semantics, but we must support 1.5) 
    public UnknownFieldSet getUnknownFields() { 
    throw new UnsupportedOperationException(
     "This is supposed to be overridden by subclasses."); 
    } 

和在生成的類被覆蓋。您可能需要重新編譯所有使用生成的協議緩衝區類的類。

鑑於消息

java.lang.VerifyError: class com.mta.pb.ACM$MyRequest overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet; 

這告訴您正在運行與協議fuffers-2.4.1(或更早)罐生成與協議 - 緩衝器2.5.0代碼

+0

謝謝。那是我做的第一件事。我有一個生成的文件。升級之後,我將它從客戶端和服務器上刪除,然後用protoc 2.5.0版重新編譯。我還替換了客戶端和服務器中的2.4.1罐。 (我自己編譯了lib jar文件,我想知道2.5.0 lib本身是否可以用我的2.4.1以上版本編譯) – auval 2013-04-22 16:23:19

+0

一個簡單的錯誤是重新編譯Descriptor proto與舊的protoc版本。這個錯誤看起來像2.4.1掛在某處。我不能建議在哪裏。 – 2013-04-22 23:40:10

+0

我編譯我的描述符.proto與正確的protoc開始。不幸的是,這是另一回事 – auval 2013-04-23 07:39:49

1

我升級到2.5後編譯應用程序時發生了類似的事情。最終我意識到舊的2.4 jar文件與新的2.5 jar文件仍然在同一個文件夾中,並且構建系統xml文件仍然指向舊版本。這只是一個更小心的問題 - 沒有什麼神祕的事情發生。