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

时间:2016-05-04 13:55:44

标签: 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);
    }
}

我现在需要序列化。由于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

谢谢大家的回复。他们都对我有所启发和帮助。

3 个答案:

答案 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> {
    ...
}

这将确保您无法使用非可序列化类型对类进行参数化。