2016-07-20 20 views
0
CreateOrderRequest req = new CreateOrderRequest(); 

req.pid=1111; 
req.name="xxx"; 

TMemoryBuffer mem_buf = new TMemoryBuffer(512); 
TJSONProtocol bin_proto = new TJSONProtocol(mem_buf,true); 

try 
{ 
    req.write(bin_proto); 
    System.out.println("====begin serial json================="); 
    String jsonStr=mem_buf.toString("utf-8"); 
    System.out.println("after jasonprocol="+jsonStr); 

    System.out.println("====begin deserial json================="); 
    CreateOrderRequest req2 = new CreateOrderRequest(); 
    TMemoryBuffer mem_buf2 = new TMemoryBuffer(512); 
    byte[] data = jsonStr.getBytes(); 
    mem_buf2.write(data); 

    TJSONProtocol bin_proto2 = new TJSONProtocol(mem_buf2,true); 
    req2.read(bin_proto2); 
    System.out.println("after de jasonprocol pid="+req.pid); 
    System.out.println("after de jasonprocol name="+req.name); 
} 
catch(Exception e) 
{ 
    System.out.println(e); 
} 

Ausgang:Kann nicht das Objekt wieder nach dem Schreiben gelesen, wenn der Parametersatz fieldNamesAsString_ mit TJSONProtocol wahr ist

====begin serial json================= 

after jasonprocol={"pid":{"i32":1111},"uid":{"i32":0},"corpId": {"i32":0},"sharePriceE6":{"i64":0},"shareCount":{"i32":0},"totalPriceE6":{"i64":0},"bankcardId":{"i32":0},"name":{"str":"xxx"},"isAnonymous":{"tf":0},"expectIncomeE6":{"i64":0},"clientId":{"i32":0},"totalAmtE6":{"i64":0},"subSrc":{"str":""}} 
====begin deserial json================= 

org.apache.thrift.protocol.TProtocolException: Unexpected character:p 

Frage:

Wenn die fieldNamesAsString_ nicht wahr gesetzt ist, dann jasonStr wird {"1": {"i32":1111},"2":{"i32":0},"3":{"i32":0},... und kann zurück in CreateOrderRequest geschrieben werden, ich denke nicht, dass es sinnvoll ist.

Sie können ein Objekt in eine json str schreiben, aber nicht zurücklesen?

Antwort

0

Der Parameter fieldNamesAsString führt zu genau demselben Effekt: ein schreibgeschütztes JSON-Format. Sie können diese Art von JSON nicht einfach mit Thrift im Design lesen.

Also im Wesentlichen das ist ähnlich wie this issue, wenn auch nicht genau das gleiche Problem.

Sie können ein Objekt in eine JSON-Str schreiben, aber nicht zurücklesen?

Ja, das ist die Absicht hier. Offensichtlich gibt es Leute, die einen Anwendungsfall dafür haben.

Weiterführende Literatur:

+0

Vielen Dank für Ihre Antwort, aber ich denke, es wird nicht sehr komplex sein, die deserialize Verfahren zu implementieren, und warum es nicht tun? weil das TField sowohl die Sparifid als auch die fiedName, – robin

+0

@robin, gespeichert hat. "Ich denke, es wird nicht sehr komplex zu implementieren sein." - Dies ist Open Source, also einfach weg Feuer! [Sie können gerne eine Pull-Anfrage stellen] (https://trift.apache.org/docs/HowToContribute). – JensG