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.
InformationsquelleAutor Amir Uval | 2013-04-21
Schreibe einen Kommentar