我应该使用哪个序列化库?

时间:2012-04-20 04:48:47

标签: java serialization

我想序列化某个对象上的某些字段。并且在反序列化过程中强制通过适当的构造函数重新构造对象。这可能吗?

例如:

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);
    }
}

我想存储人的“姓名”和“年龄”字段。并且在反序列化时,调用构造函数并重新创建父对象。

3 个答案:

答案 0 :(得分:1)

xstream支持在增强模式下使用默认构造函数以外的构造函数。

http://x-stream.github.io/index.html

答案 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()