[alibaba/fastjson]使用JSONCreator初始化实例后,反序列化不调用Setter。

2025-11-11 878 views
8

见代码:

public class HostPoint implements Serializable {

    // ------------------------------------------------------------------------

    private final static long serialVersionUID = 1L;

    private final HostAddress address;

    @JSONField(name = "fingerprint")
    private Fingerprint fingerprint;

    @JSONField(name = "unkown")
    private boolean unkown;

    // ------------------------------------------------------------------------

    @JSONCreator
    public HostPoint(@JSONField(name = "address") HostAddress addr) {
        this.address = addr;
    }

    // ------------------------------------------------------------------------

    public boolean isChanged() {
        return false;
    }

    public boolean isMatched() {
        return false;
    }

    // ------------------------------------------------------------------------

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass()) //
            .addValue(address)                        //
            .addValue(fingerprint)                    //
            .toString();
    }

    @Override
    public int hashCode() {
        return Objects.hash(address);
    }

    // ------------------------------------------------------------------------

    public HostAddress getAddress() {
        return address;
    }

    public Fingerprint getFingerprint() {
        return fingerprint;
    }

    public void setFingerprint(Fingerprint fingerprint) {
        this.fingerprint = fingerprint;
    }

    public boolean isUnkown() {
        return unkown;
    }

    public void setUnkown(boolean unkown) {
        this.unkown = unkown;
    }

}

调用反序列化后,如下打印:

HostPoint{HostAddress{192.168.10.101}, null}

调用JSONObject obj, 打印JSON如下:

{
    "address":{
        "hostAddress":"192.168.10.101"
    },
    "unkown":false,
    "fingerprint":{
        "source":"abc"
    },
    "matched":false,
    "changed":false
}

即在使用标签指定构造器后,反序列化器不调用Setter了。

回答

2
public class Fingerprint implements Serializable {

    // ------------------------------------------------------------------------

    private final static long serialVersionUID = 1L;

    private final static Logger logger = LoggerFactory.getLogger(Fingerprint.class);

    private static FingerprintEngine engine;

    private final String source;

    private ImmutableMap<String, String> probes;

    // ------------------------------------------------------------------------

    @JSONCreator
    public Fingerprint(@JSONField(name = "source") String fingerprint) {
        this.source = fingerprint;
//        this.probes = getEngine().map(fingerprint);
    }

    // ------------------------------------------------------------------------

    public static FingerprintEngine getEngine() {
        if (engine == null) {
            engine = InstanceFactory.getInstance(FingerprintEngine.class);
        }
        return engine;
    }

    // ------------------------------------------------------------------------

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass()) //
            .addValue(source)                    //
            .toString();
    }

    public boolean sameTo(Fingerprint obj) {
        for (String key : probes.keySet()) {
            System.out.println(key);
        }
        return false;
    }

    // ------------------------------------------------------------------------

    public String getSource() {
        return source;
    }

}
7

什么版本?

6

groupId:com.alibaba artifactId:fastjson version:1.2.24-1.2.38

4

原来就是这样设计的,JSONCreator需要一次性构造其他的忽略

7

@wenshao 这样设计的初衷是?在未来的版本中是否会改变?

1

当时这样设计的初衷是实现简单,考虑做改变,只是需要较多时间,我看国庆期间如果不出行就应该能完成