7.4.3. 高度な外部ナライザー
AdvancedExternalizer は、Externalizer で説明されている、ユーザーフレンドリーな外部データベース定義モデルの辞書性を解決する、マーシャリング/アンマーシャリングユーザー定義のクラスを外部が提供する代替方法を提供します。以下に例を示します。
import org.infinispan.marshall.AdvancedExternalizer;
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 AdvancedExternalizer<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());
}
@Override
public Set<Class<? extends Person>> getTypeClasses() {
return Util.<Class<? extends Person>>asSet(Person.class);
}
@Override
public Integer getId() {
return 2345;
}
}
}
最初の顕著な違いは、このメソッドではユーザークラスを anyway でアノテーションする必要がないことです。そのため、ソースコードが利用できないクラスや、変更できないクラスで使用できます。externalizer とマーシャリング/アンマーシャリングされたクラスとの間のバインドは、この外部ャーがマーシャリングできるクラスの一覧を返す getTypeClasses() の実装を提供することで設定されます。
7.4.3.1. Externalizers と Marshaller クラスをリンク リンクのコピーリンクがクリップボードにコピーされました!
Externalizer の readObject()メソッドおよび writeObject()メソッドを実装したら、それらを外部化するタイプクラスとリンクします。これを実行するには、Externalizer 実装は getTypeClasses()実装を提供する必要があります。以下に例を示します。
import org.infinispan.commons.util.Util;
...
@Override
public Set<Class<? extends ReplicableCommand>> getTypeClasses() {
return Util.asSet(LockControlCommand.class, RehashControlCommand.class,
StateTransferControlCommand.class, GetKeyValueCommand.class,
ClusteredGetCommand.class,
SingleRpcCommand.class, CommitCommand.class,
PrepareCommand.class, RollbackCommand.class,
ClearCommand.class, EvictCommand.class,
InvalidateCommand.class, InvalidateL1Command.class,
PutKeyValueCommand.class, PutMapCommand.class,
RemoveCommand.class, ReplaceCommand.class);
}
上記のコードでは、ReplicableCommandExternalizer は複数のタイプのコマンドを外部化できることを示しています。実際、ReplicableCommand インターフェースを拡張するすべてのコマンドをマーシャリングしますが、現在フレームワークはクラスの等価比較のみをサポートしているため、マーシャリングするクラスが特定のクラス/インターフェースのすべての子であることを示すことはできません。
ただし、外部化するクラスがプライベートである場合があるため、実際のクラスインスタンスを参照できない場合があります。このような場合、ユーザーは指定の完全修飾クラス名でクラスを検索し、そのクラスをパスできます。以下に例を示します。
@Override
public Set<Class<? extends List>> getTypeClasses() {
return Util.<Class<? extends List>>asSet(
Util.loadClass("java.util.Collections$SingletonList"));
}