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 を使用すると、独自のカスタム シリアライザーとデシリアライザーを登録できます。これは、次の 2 つの部分を定義することによって行われます。 Json Serialiers: オブジェクトのカスタム シリアライゼーションを定義する必要があります。 Json Deserializers: 型のカスタム デシリアライゼーションを定義する必要があります。

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

JSON 文字列フラグメントを DateTime オブジェクトに逆シリアル化する必要がある場合、Gson は fromJson() を呼び出します。

于 2012-04-20T05:23:22.760 に答える