3

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

例如:

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

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

4

3 回答 3

1

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

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

于 2012-04-20T05:07:18.537 回答
0

如果您更改您的类Person以使其实现,Serializable那么您可以简单地使用 Java 序列化功能。反序列化过程将重新创建所有对象层次结构。

如果您的任务只是序列化和存储该类,则不需要任何其他库。

这里有一篇关于 Java 序列化的简单文章。

于 2012-04-20T05:10:42.197 回答
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);

如果您需要比这更自定义的东西,您可以使用自定义序列化和反序列化。从用户指南

自定义序列化和反序列化

有时默认表示不是您想要的。处理库类(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()

于 2012-04-20T05:23:22.760 回答