小编m0m*_*0m0的帖子

指定在ObjectOutputStream中(未)序列化哪些字段而不使用transient或serialPersistentFields

有没有办法告诉ObjectOutputStream可序列化类的哪些字段应该序列化而不使用关键字transient而不定义serialPersistentFields-array?


背景:我需要使用注释来定义类的哪些成员应该被序列化(或更好:不被序列化).涉及的类必须实现接口Serializable,但不是Externalizable,所以我不想为每个对象实现序列化/反序列化算法,而只是为它使用注释.我不能使用transient关键字,因为注释需要进一步检查以确定是否应该序列化字段.这些检查必须由ObjectOutputStream(或在我自己的子类中ObjectOutputStream)完成.我也无法serialPersistentFields在每个类中定义一个-array,因为如前所述,在编译时没有定义哪些字段应该被序列化.

所以在受影响的类中唯一应该注意的是field-level(@Target(ElementType.FIELD))的注释.

在过去的几天里我尝试了很多方法,但是没有找到一个有效的方法:


ObjectOutputStream有一个方法writeObjectOverride(Object)可以用来延伸时以限定自己实现的串行化过程的ObjectOutputStream.这仅在ObjectOutputStream使用no-argument-constructor初始化时有效,因为否则writeObjectOverride永远不会调用.但是这种方法要求我自己实现整个序列化过程,我不想这样做,因为它非常复杂并且已经默认实现了ObjectOutputStream.我正在寻找一种方法来修改默认的序列化实现.


另一种方法是ObjectOutputStream再次扩展并覆盖writeObjectOverride(Object)(在调用之后enableReplaceObject(true)).在这个方法中,我尝试使用某种SerializationProxy(参见什么是序列化代理模式?)来将序列化对象封装在代理中,该代理定义了应该序列化的字段列表.但是这种方法也失败了,因为writeObjectOverride也被调用List<SerializedField> fields代理中的字段列表()导致无限循环.

例:

public class AnnotationAwareObjectOutputStream extends ObjectOutputStream {    
    public AnnotationAwareObjectOutputStream(OutputStream out)
            throws IOException {
        super(out);
        enableReplaceObject(true);
    }

    @Override
    protected Object replaceObject(Object obj) throws IOException {
        try {
            return new SerializableProxy(obj);
        } catch …
Run Code Online (Sandbox Code Playgroud)

java reflection serialization

7
推荐指数
1
解决办法
2502
查看次数

标签 统计

java ×1

reflection ×1

serialization ×1