7.4.2. User Friendly Externalizers
最も単純な形式では、ユーザーはマーシャリング/アンマーシャリングするタイプに Externalizer 実装を提供し、使用する外部ナライザークラスを示す {@link SerializeWith} アノテーションを使用してマーシャリングされたタイプクラスにアノテーションを付けるだけです。以下に例を示します。
import org.infinispan.commons.marshall.Externalizer;
import org.infinispan.commons.marshall.SerializeWith;
@SerializeWith(Person.PersonExternalizer.class)
public class Person {
final String name;
final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public static class PersonExternalizer implements Externalizer<Person> {
@Override
public void writeObject(ObjectOutput output, Person person)
throws IOException {
output.writeObject(person.name);
output.writeInt(person.age);
}
@Override
public Person readObject(ObjectInput input)
throws IOException, ClassNotFoundException {
return new Person((String) input.readObject(), input.readInt());
}
}
}
ランタイム時に JBoss Marshalling はオブジェクトを検査し、それがマーシャリング可能である(アノテーションに想定)であることを検出します。そのため、渡された外部izer クラスを使用してマーシャリングします。外部データベースの実装をコードをより簡単にするために、型 < T > をマーシャリング/アンマーシャリングするオブジェクトのタイプとして定義するようにしてください。
この外部ライザーの定義方法は非常にユーザーフレンドリーですが、以下のような不利な点があります。
- モデルの制約により、同じクラスの異なるバージョンのサポートや Externalizer クラスをマーシャリングする必要があるなどの理由で、この方法で生成されたペイロードサイズは最も効率的ではありません。
- このモデルでは、マーシャリングされたクラスには link:https://access.redhat.com/webassets/avalon/d/red-hat-data-grid/7.3/api/org/infinispan/commons/marshall/SerializeWith.html を指定する必要があります。ただし、ユーザーはソースコードが利用できないクラス用に Externalizer を指定する必要がある場合や、他の制約では変更できません。
- このモデルによるアノテーションの使用は、ユーザーから離れるマーシャリング層などの低レベルの詳細を抽象化しようとするフレームワーク開発者やサービスプロバイダーに制限される場合があります。
これらの欠点のいずれかの影響を受ける場合、外部担当者を提供する代替方法は、より高度な外部管理者で利用できます。