有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java序列化接口

我正在尝试序列化具有接口的构造函数中的对象,我将解释:

这是对象类:

public class MyObj implements Serializable{
    private static final long serialVersionUID = -29238982928391L;
    private MyCallback onMyCallback;
    private String shortcutsText;

    public MyObj(String shortcutsText, MyCallback onMyCallback){
        this.shortcutsText = shortcutsText;
        this.onMyCallback = onMyCallback;
    }

    public MyCallback getOnMyCallback() {
        return onMyCallback;
    }
}

这是MyCallback接口:

public interface MyCallback extends Serializable {
    long serialVersionUID = -1306760703066967345L;
    void onMyCallbackClickListener();
}

但是当我尝试用(outisObjectOutputStream)编写它时:

MyCallback myCallback = new MyCallback() {
            @Override
            public void onMyCallbackClickListener() {
                Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show();
            }
        };
out.writeObject(myCallback);

或与:

out.writeObject(new MyObj("Test", myCallback));

它抛出:

java.io.NotSerializableException


共 (4) 个答案

  1. # 1 楼答案

    “强烈反对内部类(即非静态成员类的嵌套类)的序列化,包括本地类和匿名类”。所以,你不能这样写:

    MyCallback myCallback = new MyCallback() { @Override public void onMyCallbackClickListener() { Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show(); } };

  2. # 2 楼答案

    interfaceabstract class无法序列化,只有实现java.io.Serializable和基元类型的具体类才能序列化。序列化用于传输信息/数据。尽管您可以编写如下内容,但这并不意味着您可以序列化接口

    public static class MyObj implements Serializable{
        private static final long serialVersionUID = -29238982928391L;
    
        private String text;
        private MyCallback callback;
    
        MyObj(String text, MyCallback callback){
            this.text = text;
            this.callback = callback;
        }
    
        MyCallback getCallback(){
            return callback;
        }
    
    }
    
    interface MyCallback extends Serializable{
    }
    
    static class MyCallbackImpl implements MyCallback {
        private static final long serialVersionUID = -19238982928391L;
    }
    
    public static void main(String args){
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
        ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream);
    
        MyCallback tout = new MyCallbackImpl();
        System.out.println(tout.toString());
        out.writeObject(tout);
    
        MyObj obj = new MyObj("test", tout);
        out.writeObject(obj);
        System.out.println(obj.getCallback());
        out.close();
    }
    

    实际上是具体的类MyCallbackImpl被序列化了。从输出可以看出:

    Test$MyCallbackImpl@17d10166
    Test$MyCallbackImpl@17d10166
    

    正如其他答案所提到的,根据详细解释here,匿名类、本地类和非静态内部类无法序列化

  3. # 4 楼答案

    出现此异常是因为无法序列化匿名内部类