使用 Object 字段序列化类的方法?

Vic*_*Vic 2 java serialization

我一直在使用一个类:

public class Change {
    Object affectedObj;  //takes an instance of any class
    String affectedFieldName;
    float shift;
    ...

    public void apply() {
        affectedObj.getClass().getField(affectedFieldName).setFloat(affectedObj, shift);
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在需要序列化。由于Object不可序列化,如何使我的类可序列化?

我想到的一件事是Object用泛型<T>类型替换:

public class Change<T> {
    T affectedObj;  //takes an instance of any class
    String affectedFieldName;
    float shift;
    ...

    public void apply() {
        affectedObj.getClass().getField(affectedFieldName).setFloat(affectedObj, shift);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法判断这种方法的缺点。如果这是一个好方法,那么这里关于序列化的陷阱是什么?

聚苯乙烯

谢谢各位大佬的回复。他们都对我很有启发性和帮助。

Boa*_*ann 5

不一定有任何问题。Object不是Serializable,但也不是 Serializable。您仍然可以序列化一个声明Object字段的类,前提是在序列化时字段恰好为 null 或它们指向Serializable对象的实例。(否则,序列化将失败并显示NotSerializableException.)

如果您真的需要affectedObj成为“任何类”,那么您确实有问题,因为无论您多么努力,有些东西都无法序列化(例如,打开网络连接)。

如果要限制affectedObjSerializable对象,只需将该字段声明为 type Serializable

public class Change implements Serializable {
    Serializable affectedObj; // takes an instance of any Serializable class
    ...
}
Run Code Online (Sandbox Code Playgroud)

没有必要为此使用泛型。如果出于其他原因需要,您仍然可以使用泛型,例如,如果您希望类的用户能够以完全类型化的方式设置和获取该字段。但是,它不影响序列化。