我一直在使用一个类:
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);
}
}
我现在需要序列化。自 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);
}
}
但我无法判断这种方法的缺点。如果这是一个很好的方法,那么关于序列化的陷阱是什么?
附言
谢谢大家的回复。他们都对我很有启发和帮助。
最佳答案
不一定有问题。 Object
不是Serializable
,但它也是not not Serializable
。您可以仍然序列化声明Object
字段的类,前提是在序列化时这些字段恰好为空或者它们指向Serializable
对象的实例。 (否则,序列化将失败并返回 NotSerializableException
。)
如果你真的需要 affectedObj
是“任何类”,那么你确实有问题,因为有些东西无论你怎么努力都无法序列化(打开网络连接,例如)。
如果要将affectedObj
限制为Serializable
对象,只需将字段声明为类型Serializable
:
public class Change implements Serializable {
Serializable affectedObj; // takes an instance of any Serializable class
...
}
没有必要为此使用泛型。如果您出于其他原因需要泛型,您仍然可以使用泛型,例如,如果您希望类的用户能够以完全类型化的方式设置和获取该字段。但是,它不会影响序列化。
关于java - 使用 Object 字段序列化类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37029918/