我想序列化某个对象上的某些字段。并且在反序列化过程中强制通过适当的构造函数重新构造对象。这可能吗?
例如:
public Person()
{
private String name;
private int age;
private Person parent;
void Person(String name, int age)
{
this.name = name;
this.age = age;
this.parent = new Person("Mom", 65);
}
}
我想存储人的“姓名”和“年龄”字段。并且在反序列化时,调用构造函数并重新创建父对象。
答案 0 :(得分:1)
xstream支持在增强模式下使用默认构造函数以外的构造函数。
答案 1 :(得分:0)
如果您更改类Person
以便它实现Serializable
,那么您可以简单地使用Java序列化功能。反序列化过程将重新创建所有对象层次结构。
如果您的任务只是序列化并存储该类,则不需要任何其他库。
这是一个关于Java序列化的简单article。
答案 2 :(得分:0)
您可以使用Gson执行此操作,以将对象序列化和反序列化为JSON表示形式。 Gson内置了能够处理通用对象的序列化器和反序列化器,但是如果你需要特殊的东西,那么你可以实现自己的。在问题中提到的示例中,如果类具有不带参数的构造函数,则通用序列化程序和反序列化程序可能会起作用。
完成所需操作的简单方法如下:
public class Person {
private String name;
private int age;
private Person parent = null;
public Person() {
// Required no-args constructor for Gson.
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
<强>序列化强>
Person joe = new Person("Joe", 20);
Gson gson = new Gson();
String json = gson.toJson(joe);
==> json is {"name":"Joe","age":"20"}
请注意,您无法使用循环引用序列化对象,因为这会导致无限递归。此外,问题中提供的示例是不可能的,因为父母将无限期地实例化。
<强>反序列化强>
Person joe = gson.fromJson(json, Person.class);
如果您需要比此更自定义的内容,则可以使用自定义序列化和反序列化。来自user guide:
自定义序列化和反序列化
有时默认表示不是您想要的。这通常是 处理库类(DateTime等)时的情况。 GSON 允许您注册自己的自定义序列化程序和反序列化程序。 这是通过定义两个部分来完成的:Json Serialiers:需要定义 对象的自定义序列化Json反序列化器:需要 为类型Instance Creators定义自定义反序列化:不需要 如果no-args构造函数可用或注册了反序列化器
GsonBuilder gson = new GsonBuilder(); gson.registerTypeAdapter(MyType2.class, new MyTypeAdapter()); gson.registerTypeAdapter(MyType.class, new MySerializer()); gson.registerTypeAdapter(MyType.class, new MyDeserializer()); gson.registerTypeAdapter(MyType.class, new MyInstanceCreator());
registerTypeAdapter调用检查类型适配器是否实现更多 而不是其中一个接口,并为所有接口注册。
编写序列化程序
以下是如何为JodaTime编写自定义序列化程序的示例 DateTime类。
private class DateTimeSerializer implements JsonSerializer<DateTime> { public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src.toString()); } }
Gson在遇到DateTime对象时调用了Json() 序列化。
编写反序列化程序
以下是如何为JodaTime编写自定义反序列化程序的示例 DateTime类。
private class DateTimeDeserializer implements JsonDeserializer<DateTime> { public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { return new DateTime(json.getAsJsonPrimitive().getAsString()); } }
当需要将JSON字符串片段反序列化为DateTime对象时,Gson调用fromJson()