带有接口的Java序列化

带有接口的Java序列化,java,serialization,interface,Java,Serialization,Interface,在Java中,我在将对象写入文件和从文件中读取对象两方面都有困难。我必须为类中的每个类编写一个方法,该类扩展提供给我们的接口。我现在的代码如下: package onlineTest; import java.util.*; import java.io.*; public class SystemManager implements Manager, Serializable { ... private static final long serialVersionUID = 1L;

在Java中,我在将对象写入文件和从文件中读取对象两方面都有困难。我必须为类中的每个类编写一个方法,该类扩展提供给我们的接口。我现在的代码如下:

package onlineTest;

import java.util.*;
import java.io.*;

public class SystemManager implements Manager, Serializable {

...

private static final long serialVersionUID = 1L;

public void saveManager(Manager manager, String fileName){

    try{
        FileOutputStream fileOut = new FileOutputStream(fileName);
        ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
        objectOut.writeObject(manager);
        objectOut.close();
    }catch(IOException e){
        e.printStackTrace();
    }
}

public Manager restoreManager(String fileName){

    Manager m = null;
    try{
        FileInputStream fileIn = new FileInputStream(fileName);
        ObjectInputStream objectIn = new ObjectInputStream(fileIn);
        m = (Manager) objectIn.readObject();
        objectIn.close();
        fileIn.close();
    }catch(IOException e){
        e.printStackTrace();
        return null;
    }catch(ClassNotFoundException f){
        f.printStackTrace();
        return null;
    }
    return m;

}

}

唯一必须保留的部分是这两种方法的名称,其中的任何内容都可以更改,但我不能更改任何名称。当我试着运行它时,它会给我一个错误,我在saveManager方法中写入objectOut.writeObject(manager),但我无法找出我做错了什么

为了序列化类,Java序列化机制要求类实现
Serializable

如果您的
Manager
类本身没有实现
Serializable
,并且无法实现,那么您可以选择使用
saveManager
方法,其中没有一种方法是最好的:

  • saveManager
    方法的签名更改为需要
    Manager
    Serializable
    子类,例如
    SystemManager
    ;但是,这有点限制,因为您可能需要序列化
    Manager
    的其他实现
  • saveManager
    中添加先决条件检查,以检查可序列化的
    manager实例。这样做的缺点是,它是一个运行时异常,实际上与您现在的情况没有太大的不同
    
  • 您还可以定义一个泛型约束,该约束要求类同时实现
    Manager
    Serializable

    <M extends Foo & Serializable> void saveManager(M manager, String filename) {
    
还要注意,类实现可序列化的
Serializable
并不能保证序列化会成功。类存储的所有引用的传递闭包也必须实现
Serializable

我提到了另一种解决方案——使
管理器
扩展
可序列化
——但这也不一定是正确的做法。由于实现
Serializable
-它们的引用的传递闭包也必须是
Serializable
-的类承受着沉重的负担,因此将此接口添加到基类中会带来沉重的负担。显然,有时这样做是正确的,但如Java第二版第74项所述:

“明智地实现可序列化的

有一个非常有用的JVM标志,用于标识导致序列化失败的特定类:

-Dsun.io.serialization.extendedDebugInfo=true

是的,Java中的序列化是一团糟。

“它给了我一个错误”错误是什么?是运行时还是编译时?请提供编译错误或堆栈跟踪的全文。您的类实现了吗?
Manager
extend
Serializable
?Manager不扩展Serializable,但我认为我不允许更改它以使其扩展Serializable。对于这些错误,它给了我一个NotSerializableException。@jblackman76在这种情况下,您需要澄清这个问题
Manager
是一个接口,如果该接口不扩展
Serializable
,您将不得不求助于一些非常可怕的方法(例如,调用
getClass()
,然后使用反射查找所有需要保存的字段)。我无法更改该方法的任何约束,我也无法更改该方法的签名。我尝试添加Serializable的前提条件检查管理器实例,但由于某些原因,我仍然收到NotSerializableException。我还收到一个WriteAbortedException。对-请注意我所说的关于实现
Serializable
不一定是可序列化的,以及如何获取有关失败的其他信息……我不确定如何或在何处添加JVM标志来标识导致序列化失败的特定类。在
java
之后的某个地方,在主类名/JAR之前。很抱歉,我知道这可能是一个愚蠢的问题,但java之后是什么意思?
-Dsun.io.serialization.extendedDebugInfo=true