Protobuf 2.5.0 bug?
Ich habe migriert von google protobuf v. 2.4.1 v. 2.5.0 (keine anderen änderungen).
Hatte ich eine perfekt funktionierende client-server [android<>gae dev-server] verwenden für die Kommunikation 2.4.1.
Jetzt mit 2.5.0 ist es gebrochen.
Ohne jede änderung .proto-Datei, ich habe meine setup-client und-server mit den neuen 2.5.0 Glas, und mit dem neuen protoc ausführbare Datei, die ich erstellt haben eine neue source-Datei für die client-und server aus der gleichen proto-Datei.
Nun bekomme ich diesen Fehler auf dem server, wenn ich versuche zu Parsen der Nachricht:
VerifyError: class ... overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;
full stack:
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
Dinge habe ich bereits ausprobiert:
1) Lesen Sie den changelog, ich habe versucht, ändern Sie die parse-code aus:
request = MyRequest.parseFrom(requstBlob);
zu
request = MyRequest.PARSER.parseFrom(requstBlob);
(dies ist die gleiche Linie 91, sehen Sie in der stack-trace).
Es hat sich nicht geändert, eine Sache. Gleichen Fehler.
2) ich habe versucht, zu analysieren, die Nachricht manuell:
Ich druckte mir die base64-string kommt, um den server, konvertiert es in ein binäres
base64 -d in64 > out64.bin
als
protoc --decode=MyRequest my.proto < out64.bin > tmp.txt
Und analysiert es perfekt.
Das problem ist also nur bei den Analyse-Teil der neuen protobuf.
3) ich habe versucht, ReqType aus MyRequest, keine Wirkung.
Referenz: die relevanten protobuf-definition -
/**
* 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;
}
Jede Beratung wird sehr geschätzt!
- wenige Stunden nach der erfolglosen recherche habe ich ein Rollback auf 2.4.1 und es funktioniert wieder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde denke, du hast nicht aktualisieren /neu kompilieren etwas. In protobuf 2.4.1 version int die Gläser.
in der GeneratedMessage Klasse, getUnknownFields wurde eine Finale Methode in 2.4.1 aber in 2.5.0 wird es:
und außer Kraft gesetzt wird, in der generierten Klasse. Möglicherweise müssen Sie kompilieren Sie alle Ihre Klassen mit generierten Protokoll-Puffer-Klassen.
Angesichts der Nachrichten
Dieser sagt Ihnen, dass Sie ausgeführt werden code generiert mit Protocol-Buffers 2.5.0 mit einem Protokoll-fuffers-2.4.1 (oder früher) jar -.
Eine ähnliche Sache passiert mir, wenn ich zusammenstellen wollte, eine Anwendung nach der Aktualisierung auf 2.5. Schließlich erkannte ich, dass der alte 2.4-Glas wurde noch im selben Ordner wie der neue 2,5-Glas, und dass das build-system xml-Datei war immer noch bezogen auf die alte. Es war nur eine Frage von ein wenig mehr aufpassen - nichts geheimnisvolles im Gange war.