我已經從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;
}
任何意見,將不勝感激!
幾個小時的無果研究我已經回到2.4.1,並且它再次工作。 – auval 2013-04-21 17:04:02