java 2进制 序列化_由于jackson,Java二进制序列化失败

我使用jackson 2将json转换为java对象.到现在为止还挺好.但我也使用hazelcast来分发集群中的对象.因此,所有bean都必须是java.io.Serializable.当我从json中读取Object时,如下所示:

ObjectMapper mapper = new ObjectMapper();

mapper.addMixInAnnotations(AbstractBean.class, MongoIdMixIn.class);

// this is to prevent from failing on missing type class property: @JsonProperty("@class")

Object tgtObject = targetClass.newInstance();

mapper.readerForUpdating(tgtObject).readValue(dbo.toString());

// put into hazelcast map

target.put(dbo.get(keyColumn), tgtObject);

我将从hazelcast获得一个例外:

java.io.NotSerializableException: com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer

我想知道com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer来自哪里,因为Object是一个普通的java bean(但是使用继承).

我的抽象类是:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

@JsonIgnoreProperties(ignoreUnknown = true)

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@javaClass")

public abstract class AbstractBean implements Serializable {

@JsonIgnore public static final transient IMarkupParser MARKUP_PARSER = new WikiMarkupParser();

@JsonProperty("id")

private String id;

@JsonProperty("@class")

private String clazz;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getClazz() {

return this.getClass().getSimpleName();

}

}

我的孩子是:

public class Posting extends AbstractBean {

private String postingSource;

private String languageCode;

public String getPostingSource() {

return postingSource;

}

public void setPostingSource(String postingSource) {

this.postingSource = postingSource;

}

public String getLanguageCode() {

return languageCode;

}

public void setLanguageCode(String languageCode) {

this.languageCode = languageCode;

}

}

我不知道为什么serailizer甚至会尝试序列化mixin,因为它们不是bean的一部分但是在这里它们是(是的,我试图使它们也可序列化,就像测试一样,没有运气):

public interface IdMixins extends Serializable {

}

public interface MongoIdMixIn extends IdMixins {

@JsonProperty("_id")

@JsonSerialize(using = MongoIdSerializer.class)

public String getId();

@JsonProperty("_id")

@JsonDeserialize(using = MongoIdDeserializer.class)

public void setId(String id);

}

public class MongoIdDeserializer extends JsonDeserializer implements Serializable {

private static final long serialVersionUID = -5404276857799190647L;

@Override

public String deserialize(JsonParser jp, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

String value = null;

String tmp = jp.getText(); // {

validate(jp, tmp,"{");

int curly = 1;

while (jp.nextToken() != null) {

String v = jp.getText();

if (v.equals("{")) curly++;

if (v.equals("$oid")) {

jp.nextToken();

value = jp.getText();

}

if (v.equals("}")) curly--;

if (curly<=0) return value;

}

return null;

}

private void validate(JsonParser jsonParser, String input, String expected) throws JsonProcessingException {

if (!input.equals(expected)) {

throw new JsonParseException("Unexpected token: " + input, jsonParser.getTokenLocation());

}

}

}

public class MongoIdSerializer extends JsonSerializer implements Serializable {

private static final long serialVersionUID = 3435689991839324194L;

@Override

public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

jsonGenerator.writeStartObject();

jsonGenerator.writeFieldName("$oid");

jsonGenerator.writeString(s);

jsonGenerator.writeEndObject();

}

}

解决方法:

愚蠢的我!序列化链中的某个地方是一个完全不必要的ObjectMapper对象.但很难找到,因为Posting对象不是真正的原因,而是另一个对象.但Stacktrace和com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer异常完全错过领先! …集群软件有时候很难调试:-)

标签:json,java,serialization,jackson

来源: https://codeday.me/bug/20190708/1400656.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值