我一直在上课:
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);
}
}
但我不能判断这种方法的缺点。如果这是一个很好的方法,那么关于序列化的缺陷是什么?
PS
谢谢大家的回复。他们都对我有所启发和帮助。
答案 0 :(得分:3)
没有任何问题。 Object
不是Serializable
,但也不是 Serializable
。你可以仍然序列化一个声明Object
字段的类,提供,在序列化时,字段恰好为null或者它们指向{的实例{1}}个对象。 (否则,序列化将失败并显示Serializable
。)
如果你确实需要NotSerializableException
成为&#34;任何类&#34;,那么你确实遇到了问题,因为无论你怎么努力都有一些无法序列化的东西(开放网)连接,例如)。
如果您想将affectedObj
限制为affectedObj
个对象,只需将该字段声明为Serializable
类型:
Serializable
没有必要为此使用泛型。如果由于其他原因需要泛型,您仍然可以使用泛型,例如,如果您希望类的用户能够以完全打字的方式设置并获取该字段。但它并没有影响序列化。
答案 1 :(得分:1)
除非您通过添加Change<T extends Serializable>
将T限制为可序列化,否则使您的课程通用不会帮助您,但它会限制您的课程可以接受的类型。
另一种选择是实现Externalizable,但是你需要同时实现read()和write(),并且必须序列化一个未知对象。
有没有理由不使用非java特定格式,如json,thrift,msgpack或其他?
答案 2 :(得分:0)
它看起来不是一个糟糕的方法,但我肯定会将你的通用参数上限为:
public class Change<T extends Serializable> {
...
}
这将确保您无法使用非可序列化类型对类进行参数化。