强制静态字段的序列化

时间:2011-03-16 18:13:18

标签: java serialization

我需要使用大量静态字段(在运行时填充和修改的数组)来保留几个类。从静态字段转换为实例变量需要花费很多精力,所以我宁愿选择快速解决方案,如果有的话。

到目前为止,阻力最小的路径是为每个班级烹饪我自己的writeObject()

或者,我不需要序列化 ​​- 任何从持久存储中存储/加载对象的机制都可以。例如。 XMLDecoder分解bean对象等

3 个答案:

答案 0 :(得分:2)

您可以编写一个方法来使用反射来序列化所有静态方法。静态方法可以标记为瞬态,通常是多余的,但您可以使用它来突出显示您不想序列化的静态字段。您可以从writeObject()调用此方法,以节省您必须为每个字段执行此操作。

答案 1 :(得分:1)

我创建了一个收集所有静态字段的新类,我们称之为StaticInfoClass。在StaticInfoClass中创建所有非静态字段。在类StaticInfoClass的旧类中创建属性。原始类的所有实例都将包含对StaticInfoClass唯一实例的引用,该实例将包含在运行时填充和修改的所有数组。如果你有线程,请确保使用synchronized方法使其成为一个bean,以避免竞争条件。

使用这种方法,实质上,您实现静态字段而不实际使用static修饰符。这种简单的方法应该很容易解决序列化和反序列化问题,大多数框架都可以很容易地处理它。

还要记住,static字段和程序中的全局状态通常是不好的做法,应该避免。如果不是声明常量或其他在运行时肯定没有改变的普通数据结构,我倾向于不使用静态。

答案 2 :(得分:0)

没试过,但可能会奏效。如果您的类定义了一个名为serialPersistentFields的ObjectStreamField对象数组,那么您可以显式声明保存的特定字段。您可以将任何值推入其中,甚至是静态字段。

private static String lastUser;
private static int maxAge;
private final static ObjectStreamField[]
    serialPersistentFields = {
      new ObjectStreamField(
      "lastUser", String.class),
      new ObjectStreamField("maxAge", int.class)
    };

然后,您必须实现readObject,以获取这些值并为静态变量设置它。因此,基本上这种机制允许您通过序列化从任何地方编组/解组字段。一旦你回过头来,你只需要知道如何处理它们。我仍然建议支付将静态数据移动到成员变量的价格。

详细信息:http://java.sun.com/developer/technicalArticles/ALT/serialization/