1

X509CertificateObjectを使用して Bouncy Castle をシリアライズおよびデシリアライズしようとしていますorg.apache.commons.lang3.SerializationUtils。どうやら、逆シリアル化されたオブジェクトはsun.security.x509.X509CertImpl、最初にシリアル化されたオブジェクト ( org.bouncycastle.jce.provider.X509CertificateObject) とは異なる型 ( ) です。その結果、キャストは失敗します。私は何を間違っていますか?

public static void test(X509CertificateObject certObj) {
    byte[] serializedObj;
    Object deSerializedObj;
    X509CertificateObject deSerializedCertObj;
    X509Certificate deSerializedCert;

    System.out.println("certObj type: " + certObj.getClass().getName());
    serializedObj = SerializationUtils.serialize(certObj);
    deSerializedObj = SerializationUtils.deserialize(serializedObj);
    System.out.println("deSerializedObj type: " + deSerializedObj.getClass().getName());
    deSerializedCert = (X509Certificate) deSerializedObj;
    System.out.println("deSerializedCert type: " + deSerializedCert.getClass().getName());
    deSerializedCertObj = (X509CertificateObject) deSerializedObj;
    System.out.println("deSerializedCertObj type: " + deSerializedCertObj.getClass().getName());
}

結果:

certObj type: org.bouncycastle.jce.provider.X509CertificateObject
deSerializedObj type: sun.security.x509.X509CertImpl
deSerializedCert type: sun.security.x509.X509CertImpl

そして最後に

java.lang.ClassCastException: sun.security.x509.X509CertImpl cannot be cast to org.bouncycastle.jce.provider.X509CertificateObject
at Test.test(Test.java:1010)
at Test.main(Test.java:153)

X509CertificateObjectこれは、 の上位クラスX509Certificateが抽象的であり、および/またはX509CertificateObject独自の を定義していないためserialVersionUIDですか?

4

2 に答える 2

3

にキャストするだけjava.security.cert.X509Certificateで、他のすべてのクラスを拡張する必要があります。sun.*クラスを期待したり使用したりしないでください。

于 2012-11-14T09:18:00.933 に答える
0

最終的に回避策/解決策を見つけました。Java シリアライゼーションの問題は、BC と Java JCE の間の競合が原因のようです。私は現在、 Apache Commons Codecに関連してXStreamを使用しています:

import org.apache.commons.codec.binary.StringUtils;
import com.thoughtworks.xstream.XStream;

public static byte[] serializeToXML(Object obj, XStream xStreamConfig)
    throws Exception
{
    XStream xstream;
    String certObjString;
    byte[] certObjByte;

    if(xStreamConfig == null) {
        xstream = new XStream();
    } else {
        xstream = xStreamConfig;
    }

    certObjString = xstream.toXML(obj);

    certObjByte = StringUtils.getBytesUtf8(certObjString);

    return certObjByte;
}

public static Object deserializeFromXML(byte[] objectByteArray, XStream xStreamConfig)
{
    String objectString;
    Object object;
    XStream xstream;

    if(xStreamConfig == null) {
        xstream = new XStream();
    } else {
        xstream = xStreamConfig;
    }

    objectString = StringUtils.newStringUtf8(objectByteArray);

    object = xstream.fromXML(objectString);

    return object;
}
于 2012-11-30T14:07:27.000 に答える