用dubbo時遇到的一個序列化的坑


  首先,這是標題黨,問題並不是出現在序列化上,這是報錯的一部分:

Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to send response: Response [id=24, version=2.0.0, status=20, event=false, error=null, result=RpcResult [result=xxxService$7@57e8ec64, exception=null]], cause: java.lang.RuntimeException: Serialized class xxxService must implement java.io.Serializable
 Java field: final xxxService xxxService$7.this$0
java.lang.RuntimeException: Serialized class xxxService must implement java.io.Serializable
 Java field: final xxxService xxxService$7.this$0
    at com.alibaba.com.caucho.hessian.io.JavaSerializer$FieldSerializer.serialize(JavaSerializer.java:315)
    at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeInstance(JavaSerializer.java:263)
    at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:227)
    at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408)
    at com.alibaba.dubbo.common.serialize.support.hessian.Hessian2ObjectOutput.writeObject(Hessian2ObjectOutput.java:92)
    at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.encodeResponseData(DubboCodec.java:210)

  報了錯的是注冊給dubbo的service端,代碼類似這樣(https://github.com/saaavsaaa/warn-report/blob/master/src/test/java/TestObjectInstance.java):

class SService{
    public A getA(){
        A a = new A(){{setN("dto");}};
        return a;
    }
}

class A{
    protected String n;

    public A(){
        n = "a";
    }

    public String getN() {
        return n;
    }

    public void setN(String n) {
        this.n = n;
    }
}
    @Test
    public void testSerializ(){
        SService s = new SService();
        A a = s.getA();
        System.out.println(a.getN());
    }

   這什么情況,雖然通過dubbo的網絡傳輸是需要序列化的,但是你要我把sevice也實現Serializable是鬧哪樣,然后緊接着發現了個更奇怪的事:第二行Java field: final xxxService xxxService$7.this$0,哪來的field,哪也沒定義過這玩意,怎么還有個this...,當然上面的精簡代碼是能一眼猜到問題在哪,不過原本的代碼好幾百行,查的這個費勁,其實看到這個精簡代碼大家也基本可以猜到問題在哪了:

A a = new A(){{setN("dto");}};

代碼改成:

class SService{
    public A getA(){
//        A a = new A(){{setN("dto");}};
        A a = new A();
        a.setN("dto");
        return a;
    }
}

結果就正常了:

==========================================================

咱最近用的github:https://github.com/saaavsaaa

微信公眾號:

 

 

轉載請注明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM