3

クラス アノテーションはデフォルトのシリアライゼーションに影響を与えますか? Javaのドキュメントによると

注釈はプログラムのセマンティクスに直接影響を与えませんが、ツールやライブラリによるプログラムの処理方法に影響を与え、実行中のプログラムのセマンティクスに影響を与える可能性があります。注釈は、ソース ファイル、クラス ファイルから、または実行時に反射的に読み取ることができます。

これはノーと推測しますが、決定的な声明は見つかりませんでした。

編集:「アノテーションはJavaのデフォルトのシリアル化に影響を与えますか?」と尋ねるつもりでした。そのため、質問のテキストを変更し、あまり人気のない回答を受け入れます。私が以前に尋ねたことに答えてくれた人に謝罪します(「注釈はシリアライゼーションに影響しますか?」)。:) はい、シリアル化に影響するケースを作成できます。ただし、変更された質問は、確かに私にとってより実用的な価値があると思います。

4

2 に答える 2

2

ランタイム アノテーションに基づいて異なる方法でシリアル化するクラスを構築することができます。

public class Foo implements Externalizable {
  public void writeExternal(ObjectOutputStream out) throws IOException {
    if (getClass().getAnnotations().length == 0) {
      out.writeObject("no");
    } else {
      out.writeObject("yes");
    }
  }
  public void readExternal(ObjectInputStream in) throws IOException { ... }
}

ランタイム アノテーションを持つサブクラスのインスタンスは、writeExternal共有されているにもかかわらず、親クラスとは異なる方法でシリアル化されます。

@Retention(RetentionPolicy.RUNTIME)
@interface ARuntimeAnnotation {}

@ARuntimeAnnotation
public class SubFoo extends Foo {}

RetentionPolicy.RUNTIMEこれは、引用したように「実行中のプログラムのセマンティクスに影響を与える可能性がある」という注釈が原因で発生します。

于 2012-10-23T17:49:01.623 に答える
1

の注釈RETENTION=RUNTIMEはバイトコードですが、それ自体はシリアル化されていません。シリアル化は、クラスではなく、オブジェクト フィールドで機能します。

アノテーションは、シリアライザーで使用できます。ただし、標準の Java シリアライゼーション メカニズムはそれらを使用しません。これは、アノテーションより 10 年前の Java 1.0 用に作成されたものです。

ただし、カスタム メカニズムでは注釈を使用できます。たとえば、@Transient注釈を作成し、それを使用してシリアル化してはならないフィールドをマークできます。

writeObject()シリアライゼーションは、メソッドを使用するか、xstream のようなサードパーティ ライブラリを使用してカスタマイズできます。

多くのシリアル化ライブラリがあります。JAXB や XStream は、オブジェクトを XML にシリアル化するライブラリと考えることができます。どちらも、多数の注釈セットをサポートしています。

于 2012-10-23T17:55:02.687 に答える