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

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

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

附言

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

最佳答案

不一定有问题。 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/

相关文章:

java - Android后台服务最佳实践

java.lang.UnsatisfiedLinkError : Couldn't load native_sample from loader

java - 当我在 eclipse src 文件夹中粘贴一个 java 文件时,它没有显示

Wcf、序列化、只读成员

php - 序列化数组来存储它与在 mysql 中创建特定表

java - 包含php的js函数在未调用时执行

java - TestNG + Mockito,如何测试抛出的异常和模拟调用

c# - 可移植类库对象序列化

c# - XmlSerializer 在序列化动态加载的类型时抛出异常

java - Java中的延迟引用设置