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"));
}
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る