[英]How to serialize specific fields of an object?
我想序列化對象上的某些字段。 並在反序列化過程中強制通過適當的構造函數重新構造對象。 這可能嗎 ?
例如:
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);
}
}
我想存儲人的“姓名”和“年齡”字段。 並且在反序列化時,調用構造函數並重新創建父對象。
xstream 確實支持在增強模式下使用默認構造函數以外的構造函數。
如果您更改類Person
以使其實現Serializable
,那么您可以簡單地使用 Java 序列化功能。 反序列化過程將重新創建所有對象層次結構。
如果您的任務只是序列化和存儲該類,則不需要任何其他庫。
這里有一篇關於 Java 序列化的簡單文章。
您可以使用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);
如果您需要比這更自定義的東西,您可以使用自定義序列化和反序列化。 從用戶指南:
自定義序列化和反序列化
有時默認表示不是您想要的。 處理庫類(DateTime 等)時經常出現這種情況。 Gson 允許您注冊自己的自定義序列化器和反序列化器。 這是通過定義兩個部分來完成的: Json Serialiers:需要為對象定義自定義序列化 Json Deserializers:需要為類型定義自定義反序列化 Instance Creators:如果無參數構造函數可用或已注冊反序列化器,則不需要
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 對象時調用 toJson()。
編寫反序列化器
這是一個如何為 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()); } }
Gson 在需要將 JSON 字符串片段反序列化為 DateTime 對象時調用 fromJson()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.