如何控制Jackson类的库序列化

Sum*_*uma 5 java serialization jackson

我有一个Piece包含类型成员的类(我们称之为a )com.jme3.math.ColorRGBA.用默认杰克逊系列化成员被序列,不仅成为其会员r,g,ba,但后来也用干将喜欢getAlpha.

由于这显然是多余的,我想控制序列化并仅序列化那些主要成员.是否可以在我的类中写入一些注释来控制不受我控制的类型的成员的序列化,或者为它们设置一些自定义序列化程序?

我可以为Piece类编写一个自定义序列化程序,虽然除了ColorRGBA序列化程序太冗长,默认序列化对我来说对所有其他属性都很好Piece,因此我想尽可能少地自定义.

我不想修改jme3库源,解决方案应该在ColorRGBA类之外实现.

was*_*ren 16

您可以使用mixin确保根据您的需要对类进行序列化.考虑以下:

// The source class (where you do not own the source code)
public class ColorRGBA {
    public float a; // <-- Want to skip this one
    public float b;
    public float g;
    public float r;
}
Run Code Online (Sandbox Code Playgroud)

然后,创建您忽略该a属性的mixin .

// Create a mixin where you ignore the "a" property
@JsonIgnoreProperties("a")
public abstract class RGBMixin {
    // Other settings if required such as @JsonProperty on abstract methods.
}
Run Code Online (Sandbox Code Playgroud)

最后,使用mixin配置映射器:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(ColorRGBA.class, RGBMixin.class);
System.out.println(mapper.writeValueAsString(new ColorRGBA()));
Run Code Online (Sandbox Code Playgroud)

输出将是:

{ "B":0.0, "G":0.0, "R":0.0}

请注意,该方法ObjectMapper.addMixInAnnotations已从Jackson 2.5中弃用,应更换为更流畅的版本:

mapper.addMixIn(ColorRGBA.class, RGBMixin.class);
Run Code Online (Sandbox Code Playgroud)

JavaDocs可以在这里找到