相关疑难解决方法(0)

指定在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中没有枚举的实例控件

这是对这个问题的跟进.这个解决方案是否不漏水?

public final class Thing implements Serializable {

    private static final long serialVersionUID = 1L;

    private static final Thing[] instances = new Thing[2];
    private static int nextOrdinal = 0;

    public static final Thing instance0 = new Thing("whatever0");
    public static final Thing instance1 = new Thing("whatever1");

    private transient final String someState;

    public String someMethod() {return someState;}

    private final int ordinal;

    private Thing(String someState) {
        this.someState = someState;
        this.ordinal = nextOrdinal++;
        instances[this.ordinal] = this;
    }

    private Object readResolve() throws ObjectStreamException …
Run Code Online (Sandbox Code Playgroud)

java

6
推荐指数
1
解决办法
9062
查看次数

标签 统计

java ×2

reflection ×1

serialization ×1