我需要使用大量静态字段(在运行时填充和修改的数组)来保留几个类。从静态字段转换为实例变量需要花费很多精力,所以我宁愿选择快速解决方案,如果有的话。
到目前为止,阻力最小的路径是为每个班级烹饪我自己的writeObject()
。
或者,我不需要序列化 - 任何从持久存储中存储/加载对象的机制都可以。例如。 XMLDecoder
分解bean对象等
答案 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/