Java二进制序列化因jackson而失败

Java二进制序列化因jackson而失败,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我使用jackson 2将json转换为java对象。到现在为止,一直都还不错。但我也使用hazelcast将对象分布在集群中。因此,所有bean都必须是java.io.Serializable。当我从json读取对象时,如下所示: ObjectMapper mapper = new ObjectMapper(); mapper.addMixInAnnotations(AbstractBean.class, MongoIdMixIn.class); // this is to prevent

我使用jackson 2将json转换为java对象。到现在为止,一直都还不错。但我也使用hazelcast将对象分布在集群中。因此,所有bean都必须是java.io.Serializable。当我从json读取对象时,如下所示:

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.desr.impl.TypeWrappedDeserializer来自哪里,因为该对象是一个普通的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的一部分,但它们在这里(是的,我也尝试过使它们可序列化,只是作为测试,不走运):

公共接口IdMixins扩展了可序列化{
}
公共接口MongoIdMixIn扩展了IDMixin{
@JsonProperty(“\u id”)
@JsonSerialize(使用=MongoIdSerializer.class)
公共字符串getId();
@JsonProperty(“\u id”)
@JsonDeserialize(使用=MongoIdDeserializer.class)
公共void setId(字符串id);
}
公共类MongoIdDeserializer扩展JsonDeserializer实现可序列化{
私有静态最终长serialVersionUID=-5404276857799190647L;
@凌驾
公共字符串反序列化(JsonParser jp,DeserializationContext DeserializationContext)引发IOException,JsonProcessingException{
字符串值=null;
字符串tmp=jp.getText();//{
验证(jp,tmp,“{”);
int curly=1;
while(jp.nextToken()!=null){
字符串v=jp.getText();
如果(v.equals(“{”))curly++;
如果(v.equals(“$oid”)){
jp.nextToken();
value=jp.getText();
}
如果(v等于(“}”)卷曲--;

如果(curly我离评论还有1个代表点,所以我必须提出一个建议作为答案;-)

也许其中一个注释确实将TypeWrappedSerializer的实例作为私有属性注入AbstractBean。也许作为反序列化机制的提示

你能用反射来检查创建的物体吗

for (Field field : tgtObject.getClass().getDeclaredFields() )
{
   // you can replace this by your logging method
   System.out.println("Field: " + field.getName() + ":" + field.getType());
}
for (Field field : tgtObject.getClass().getSuperclass().getDeclaredFields() )
{
   // you can replace this by your logging method
   System.out.println("Field: " + field.getName() + ":" + field.getType());
}

如果您在列表中找到合适的类型,则该类是通过字节码增强添加的。

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

你能提供完整的Jackson示例吗?这些混合是什么?什么是
targetClass
?@SotiriosDelimanolis目标类只是名称(配置)中的一个类在这种情况下,就是Posting.class。我已经将mixin类添加到了我的问题中,我自己尝试了一下。它不起作用。好的,注释不应该受到责备。但是TypeWrapedSerializer(名称)让我想到了annother猜测:可能是方法
ReaderForUpdate(tgtObject)
注入此反序列化程序。但这是我无法检查的。mixin注释方法还可以提供影响字节码的注释。refelction和IDE调试器均未显示任何有线字段
for (Field field : tgtObject.getClass().getDeclaredFields() )
{
   // you can replace this by your logging method
   System.out.println("Field: " + field.getName() + ":" + field.getType());
}
for (Field field : tgtObject.getClass().getSuperclass().getDeclaredFields() )
{
   // you can replace this by your logging method
   System.out.println("Field: " + field.getName() + ":" + field.getType());
}