Java泛型覆盖静态方法解决方法

时间:2018-03-27 05:38:05

标签: java generics static polymorphism method-overriding

我正在开发一个需要我序列化和反序列化通用对象的项目。我正在这样做的方法是定义一个实现Serializer和静态toBytes()的抽象类fromBytes()。这种方法一切都很顺利,因为我可以将对象实例传递给期望Foo子类的泛型类Serializer,并且我可以确保对象知道如何序列化和反序列化自身。

现在我的问题。 Java序列化有点糟透了。我有多个实现我想尝试交换进出,最终我希望用户能够决定格式。我将如何更改Serializer的实施细节?我知道我不能覆盖静态方法,所以如何在不解耦FooSerializer的情况下执行此操作,并且无法确保我的通用对象具有适当的toBytes()和{{1 fromBytes()中的方法?

如果有人混淆,这是代码:

Foo

1 个答案:

答案 0 :(得分:0)

我不确定这是不是一个好方法,但如何使用Jackson库并将对象序列化为json节点?例如:

@JsonTypeInfo(
          use = JsonTypeInfo.Id.NAME, 
          include = JsonTypeInfo.As.PROPERTY, 
          property = "type")
        @JsonSubTypes({ 
          @Type(value = SoundFile.class, name = "sound"), 
          @Type(value = VideoFile.class, name = "video") 
        })
abstract class File{
    private String id;
    private String type;
    @JsonCreator
    public File(@JsonProperty("id") String id)
    {
        this.id=id;
    }
    public String getId() {return this.id;}
    public abstract String getType();
}

class SoundFile extends File{

    @JsonCreator
    public SoundFile(@JsonProperty("id") String id) {
        super(id);
    }

    @Override
    public String getType() {
        return "sound";
    }


}

class VideoFile extends File{

    @JsonCreator
    public VideoFile(@JsonProperty("id") String id) {
        super(id);
    }

    @Override
    public String getType() {
        return "video";
    }

}

public class GenericApp {



    public static void main(String[] args) {
    ObjectMapper om = new ObjectMapper();

    List<File> files = Arrays.asList(new VideoFile("1"),new SoundFile("2"));

    //serialize
    List<byte[]> fileSerialized = files.stream().map(file->{
        try {
        return om.writeValueAsBytes(file);
        }catch(Exception e) {return null;}
    }).collect(Collectors.toList());

    //de-serialize
    List<File> filesDeSerialized = fileSerialized.stream().map(bytes ->{
        try {
            return om.readValue(bytes, File.class);
        }
        catch(Exception e) {return null;}
    }).collect(Collectors.toList());

    filesDeSerialized.stream().forEach(file->{
        System.out.println("id :"+file.getId()+" - "+file.getClass());
    });

    }

}

这将正确反序列化这些对象并打印:

id :1 - class com.dsncode.stackoverflow.VideoFile
id :2 - class com.dsncode.stackoverflow.SoundFile

但是,您应该为您的Generic Type的所有子类定义@JsonTypeInfo和@JsonSubType。因为,通过指示此字段,您将向Jackson反序列化器指明哪个类应为您的泛型类型创建。