2012-11-14 2 views
1

나는 탄력성을 X509CertificateObjectorg.apache.commons.lang3.SerializationUtils을 사용하여 직렬화 및 역 직렬화하려고합니다. 역 직렬화 된 개체의 원래 직렬화 된 개체 (org.bouncycastle.jce.provider.X509CertificateObject)와 다른 형식 (sun.security.x509.X509CertImpl)이 분명히 있습니다. 결과적으로 캐스팅이 실패합니다. 내가 뭘 잘못하고 있니? 에서자바 직렬화 (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()); 
} 

결과 : X509Certificate입니다 X509CertificateObject의 상위 클래스, 추상 및/또는 X509CertificateObject 때문에 정의하지 않기 때문에

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) 

에서이인가 자신의 serialVersionUID?

답변

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; 
} 
+0

X509Certificate를 사용하여 해결되지 않은 문제가 무엇인지 알 수 없습니다. – EJP

3

다른 모든 클래스가 확장해야하는 java.security.cert.X509Certificate으로 캐스트하면됩니다. 확실히 sun.* 클래스를 기대하거나 사용해서는 안됩니다.

+0

*'클래스입니다.. 그는 단지 탈 직렬화를 시도하고있다. –

+0

테스트를 위해 X509Certificate에 캐스트를 삽입했습니다. 이 캐스트는 성공했지만 casted Object 유형은 여전히 ​​sun.security.x509.X509CertImpl입니다. 나는 이것이 어떻게 일어날 수 있는지에 대해 의문스럽고, 왜 이것이 가능하고 X509CertificateObject 로의 캐스팅이 실패하는지에 대해 의아하게 생각합니다. –

+0

@ThomasLieven 그래서 X509CertImpl은 X509Certificate을 확장합니다. 그곳에 신비가 없습니다. X509CertificateObject도 확장 할 수 있습니다. 그러나 xxxImpl은 xxxObject를 확장하지 않으며 반대의 경우도 마찬가지입니다. – EJP