我正在开发一个需要我序列化和反序列化通用对象的项目。我正在这样做的方法是定义一个实现Serializer
和静态toBytes()
的抽象类fromBytes()
。这种方法一切都很顺利,因为我可以将对象实例传递给期望Foo
子类的泛型类Serializer
,并且我可以确保对象知道如何序列化和反序列化自身。
现在我的问题。 Java序列化有点糟透了。我有多个实现我想尝试交换进出,最终我希望用户能够决定格式。我将如何更改Serializer
的实施细节?我知道我不能覆盖静态方法,所以如何在不解耦Foo
和Serializer
的情况下执行此操作,并且无法确保我的通用对象具有适当的toBytes()
和{{1 fromBytes()
中的方法?
如果有人混淆,这是代码:
Foo
答案 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反序列化器指明哪个类应为您的泛型类型创建。