0

我正在尝试序列化具有以下字段的对象:

private TreeSet<TimeSlot<T>> counterTimeSlotSet = 
    new TreeSet<TimeSlot<T>>(
            new Comparator<TimeSlot<T>>(){
                @Override
                public int compare(TimeSlot<T> cb1, TimeSlot<T> cb2) {
                    return cb1.getPeriod().compareTo(cb2.getPeriod());
                }
            });

序列化代码如下:

    BaseSlidingWindow<BasicVelocityCounter> window1 = 
        new BaseSlidingWindow<BasicVelocityCounter>(
                BasicVelocityCounter.class, slidingWindowConfig);
    ...

    // jackson serializer test
    Version version = new Version(1, 0, 0, "SNAPSHOT");
    SimpleModule module = new SimpleModule("ZORRO", version);
    module = module.addSerializer(new DateTimeSerializer());
    // and so on...
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(module);

    mapper.writeValue(new File("C:\\tmp\\window1.json"), window1);

问题是window1类型的成员TreeSet<TimeSlot<T>>没有序列化。日志中没有出现异常。我只是得到不包含该TreeSet<TimeSlot<T>>成员的 json。

调试杰克逊代码并没有把我带到任何地方。我想知道为了获得TreeSet<TimeSlot<T>>序列化需要做什么?

编辑

我的BaseSlidingWindow类定义如下所示:

public class BaseSlidingWindow<T extends ICountable<T>> 
                        implements ISlidingWindow<T>{

    boolean dirty = false;

    private DateTime createdOn;
    private DateTime updatedOn;
    private DateTime windowLifeStart;
    private DateTime windowLifeEnd;

    private final SlidingWindowConfig slidingWindowConfig;

    private TreeSet<TimeSlot<T>> counterTimeSlotSet = 
    new TreeSet<TimeSlot<T>>(
            new Comparator<TimeSlot<T>>(){
                @Override
                public int compare(TimeSlot<T> cb1, TimeSlot<T> cb2) {
                    return cb1.getPeriod().compareTo(cb2.getPeriod());

                }
            });

    private final Class firstSeenDataType;

    // constructor, accessors and IFS implementations
    // ...
}
4

1 回答 1

2

我没有看到任何公共领域或吸气剂BaseSlidingWindow。因此,它没有可序列化的可观察属性。如果这是问题所在,最简单的方法是添加@JsonProperty之前counterTimeSlotSet和要序列化的其他属性。

替代方法包括添加“getter”方法(如getCounterTimeSlotSet)或更改默认可见性设置以包括非公共字段。

于 2012-06-11T17:30:06.603 回答