1

コミュニティの皆様、こんにちは。私は最近、私の Java プロジェクトでシリアライゼーションとデシリアライゼーションの問題を思いつきました。他のオブジェクトを fields として含むクラスのオブジェクト があります。

オブジェクトの状態をバイト配列に保存し、バイト配列逆シリアル化して元のオブジェクトを取得したいと思います。ただし、オブジェクトのフィールドを構成するオブジェクトはシリアライズ可能ではありません (サードパーティのライブラリからのもの) ため、それらを宣言する必要がありました。そもそも一時的なものとして。

現在、オブジェクトはシリアライズおよびデシリアライズされていますが、予想どおり、前に述べた一時的な宣言のため、フィールドは null です。シリアライゼーション クラスにすべての要素をローカルに作成し、それらに元の値を割り当てて続行しようとしました。プロセスですが、違いはありませんでした。コードの一部を以下に引用します。何かアイデアはありますか? 事前に感謝します:)

これがフィールドを持つ私のオブジェクトのクラスです

public class AbePublicKey implements java.io.Serializable{

private static final long serialVersionUID = 7526472295622776147L;
public transient  Element g;
public transient Element h;
public transient Element f;
public transient Element e_g_g_hat_alpha;
}

ここに私のシリアライザ関数があります

 public  byte[] PublicKeytoByteArray(AbePublicKey publickey) throws IOException {

   KeyAuthority keyauthority = new KeyAuthority();
    byte[] bytes = null;
    ByteArrayOutputStream bos = null;
    ObjectOutputStream oos = null;
    publickey.setElements(g, h, f, e_g_g_hat_alpha);

    try {
        bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
        oos.writeObject(publickey);
        oos.flush();
        bytes = bos.toByteArray();

    } finally {
        if (oos != null) 
            oos.close();
        }
        if (bos != null) {
            bos.close();
        }

    }

    return bytes;
}

これが私のデシリアライザー関数です

 public static AbePublicKey PublicKeyBytestoObject(byte[] publickeybytes) throws IOException, ClassNotFoundException {
    AbePublicKey obj = null;
    ByteArrayInputStream bis = null;
    ObjectInputStream ois = null;
    try {
        bis = new ByteArrayInputStream(publickeybytes);
        ois = new ObjectInputStream(bis);
        obj = (AbePublicKey) ois.readObject();

    } finally {
        if (bis != null) {
            bis.close();
        }
        if (ois != null) {
            ois.close();
        }
    }
    return obj;
}
4

3 に答える 3

1

オブジェクトのシリアル化方法を制御する必要がある場合は、Externalizable インターフェイスと、関連する readExternal および writeExternal メソッドを実装します。これにより、オブジェクトのシリアライズ方法を完全に制御できます。

明らかに、シリアル化できないフィールドを含むクラスをシリアル化することはできません。ただし、オブジェクトを自分で再作成するのに十分なデータを書き込むことはできます。

于 2016-09-22T21:48:56.730 に答える