3

引数なしのコンストラクターとシリアライズ可能な実装を必要とせずにシリアライズする方法はありますか?

4

9 に答える 9

2

XStreamJSXまたはGoogle Protocol Buffersを見てください。

于 2010-11-08T15:11:37.777 に答える
2

JBossシリアライゼーションは、標準の Java シリアライゼーションのドロップイン置換であり、実装する必要はありませんjava.io.Serializable。それ以外 (およびそれがはるかに高速であるという事実) は、標準のシリアライゼーション メカニズムと同じです (同じObjectInputおよびObjectOutputインターフェイスを使用します。

PS 他の JBoss との依存関係はありません。別のプロジェクトとして分割された JBoss の低レベル ライブラリの 1 つにすぎません。

于 2010-11-08T15:16:27.050 に答える
1

これを行う恐ろしい方法は、クラスの並列階層を構築することです。各クラスは、サードパーティ階層内のクラスの 1 つを代用し、それぞれが Externalizable を実装し、サードパーティから適切なフィールドを書き込むことによって自身を書き込みます。パーティのオブジェ。

しかし、私はしません。

于 2010-11-09T09:51:46.217 に答える
0

そしてDataboard、Bean スタイル、レコード スタイル、および不変スタイルのクラスをシリアル化できます。独自のクラス外部バインディングを作成することもできます。

于 2010-11-09T22:02:54.423 に答える
0

http://www.jguru.com/faq/view.jsp?EID=251942の説明を参照してください。

を実装するクラスのコンストラクターに関する唯一の要件はSerializable、継承階層内の最初のシリアル化不可能なスーパークラスに、引数のないコンストラクターが必要であることです。

  1. 引数なしのコンストラクターを使用して拡張Objectするように、引数なしのコンストラクターなしでシリアライズ可能

     public class MySerializableClass implements Serializable {
        public MySerializableClass (...)...
     }
    
  2. 引数なしのコンストラクターを使用して拡張MyFirstClassするように、引数なしのコンストラクターなしでシリアライズ可能

     public class MyFirstClass {
     }
     public class MySecondClass extends MyFirstClass implements Serializable {
        public MySecondClass (...)...
     }
    
  3. MyFirstClass実装されSerializableておらず、デフォルトのコンストラクターがないため、シリアル化できません。

     public class MyFirstClass {
        public MyFirstClass (...)...
     }
     public class MySecondClass extends MyFirstClass implements Serializable {
        public MySecondClass (...)...
     }
    
于 2016-07-28T20:33:07.653 に答える
0

Type の宣言にもかかわらず、シリアル化を強制できる場合があると思います。ただし、クラスにはシリアル化できないフィールドが含まれている可能性があり、ランタイム例外が発生する固有のリスクがあります。

カスタムコンストラクターを作成していない限り、引数なしのデフォルトコンストラクターを無料で取得できるので、私は興味があります。また、Serializable を実装すると、検索/置換に 30 秒かかります。

これらを避けようとしている理由はありますか?

于 2010-11-08T14:53:57.467 に答える
0

...そしてSerializableの実装?

残念ながら違います。すべての Serializable オブジェクトは を実装する必要がありjava.io.Serializableます。質問の最初の部分については、ObjectInputStream/ObjectOutputStreamを使用してオブジェクトをバイト配列にシリアル化したり、その逆を行うことができます。

次の例は、次の方法を示しています。

public static byte[] toByteArray(Object object) throws IOException {
        if (!isSerializable(object)) {
            throw new IOException("Object '" + object.getClass().getName() + "' is not serializable.");
        }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
    } finally {
        if (oos != null) {
            try {
                oos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                logger.error("Closing of ObjectOutputStream failed.", e);
            }
        }
    }

    return baos.toByteArray();
}

public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException {
    Object object = null;
    ObjectInputStream ois = null; 

    try {
        ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
        object = ois.readObject();
    } finally {
        if (ois != null) {
            try {
                ois.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                logger.error("Closing of ObjectInputStream failed.", e);
            }
        }
    }

    return object;
}
于 2010-11-08T16:00:26.813 に答える
0

他の人が言っているように、さまざまな選択肢があります。writeObject と readObject を使用した標準の Java シリアライゼーションに固執する場合は、サード パーティ クラスから継承する独自のアダプター クラスを作成し、独自のクラスに Serializable を実装し、writeObject と readObject をオーバーライドします。つまり、カスタム シリアライゼーションを実装します。あなたのクラス。

于 2012-02-02T08:01:14.133 に答える
0

Eishay Smith は、Java シリアライザーのベンチマークを行いました。これには、それぞれについての情報が含まれていますが、引数なしのコンストラクターを使用しているかどうかについては言及されていません (多くの場合、任意のオブジェクトでも機能しないため、問題は意味がない)。それは一見の価値があるかもしれません。

于 2010-11-08T18:52:58.450 に答える