Java 为什么我仍然得到类没有有效的构造函数错误

Java 为什么我仍然得到类没有有效的构造函数错误,java,exception,certificate,Java,Exception,Certificate,请告诉我,我对java编程很陌生。我正在尝试将一个类写入bytearrayoutputstream,然后将该数据传递给一个简单的数组 然后我从字节数组中读取并重构类 我使用ObjectOutputStream和ObjectInputStream来实现这一点。但我不明白为什么我仍然得到java.io.InvalidClassException:我的类没有有效的构造函数。我能找到的最好的帮助是在 我的代码: // this is the class I am writing to the ByteA

请告诉我,我对java编程很陌生。我正在尝试将一个类写入bytearrayoutputstream,然后将该数据传递给一个简单的数组

然后我从字节数组中读取并重构类

我使用ObjectOutputStream和ObjectInputStream来实现这一点。但我不明白为什么我仍然得到java.io.InvalidClassException:我的类没有有效的构造函数。我能找到的最好的帮助是在

我的代码:

// this is the class I am writing to the ByteArrayOutputStream
public class CrtB extends X509v3CertificateBuilder implements Serializable {
    private static final long serialVersionUID = 1234509876;

    public CrtB(X500nEx arg0, BigInteger arg1, Date arg2, Date arg3,
            X500nEx arg4, SubjectPublicKeyInfo arg5) {
        super(arg0, arg1, arg2, arg3, arg4, arg5);
    }
}
    //this how I pass the class to the ByteArrayOutputStream and then reconstruct it

public class Testclass implements Serializable {  

    public  CrtB getCrt(){
        subpubInfo=SubjectPubInfo.getInstance(getPublicKey.getEncoded());
        certbld=new CrtB(name1, serialNr, start, end,name2, subpubInfo);
        return certbld; // certbld is a global variable
    }

    //writes to the ByteArrayOutputStream
    private  ByteArrayOutputStream writetoBAS(){
        ByteArrayOutputStream bout=null;
        try{
            bout=new ByteArrayOutputStream();
            ObjectOutputStream obj=new ObjectOutputStream(bout);
            obj.writeObject(certbld);
            obj.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return bout;

    }
    //read from byte array
    private  CrtB getbui(byte[] ar){
    CrtB b=null;
    try {
        ByteArrayInputStream bin=new ByteArrayInputStream(ar);
        ObjectInputStream oin=new ObjectInputStream(bin);
        b=(CrtB)oin.readObject();
        System.out.println("successfully transferred");
    }catch (Exception e){
        e.printStackTrace();
    }
    return b;
    }

    public static void main(String[] args) {

        Testclass rqR=new Testclass();
        rqR.CrtB();
    byte[] br=rqR.writeBAS().toByteArray();
      CrtB b=rqR.getbui(br);
    }
}
谁能帮我一下或给我一个提示吗

From:
要允许序列化不可序列化类的子类型,子类型可以负责保存和恢复超类型的公共、受保护和(如果可访问)包字段的状态。只有当子类型扩展的类具有可访问的无参数构造函数来初始化类的状态时,子类型才可以承担此责任。如果不是这样,则声明类可序列化是错误的。运行时将检测到错误。

您的情况是
X509v3CertificateBuilder
没有实现
Serializable
X509v3CertificateBuilder
没有可访问(公共或受保护)的参数构造函数

它是否回答了您的问题“
我不明白为什么我仍然得到java.io.InvalidClassException


我找到了
X509v3CertificateBuilder
的定义。你用过这个吗。

请把stacktrace贴出来。@csmckelvey它不需要。无参数构造函数是自动创建的。这可能与
X509v3CertificateBuilder
构造函数未使用传入的参数有关@Kayaman是的,对不起,我还在醒来。你能确保超级(arg0,arg1,arg2,arg3,arg4,arg5);在“数字”、“类型”和参数顺序上与超级构造函数匹配。看起来您正在使用许多不同的类(
X509v3CertificateBuilder
X500nEx
,等等)——这些类是您在同一个包中创建的还是从库中导入的?如果是后者,您能在代码中包含导入语句吗?另外,您有两个公共类——它们在您的程序的同一个文件中吗?如果是,那么就不会编译了。非常感谢。但是,即使超类没有参数构造函数,我仍然可以将类写入ByteArrayOuputStream。我猜ObjectOutputStream不起作用,因为我看到您有
getCrt()
,它从数据集创建了
CrtB
的新实例。而不是试图序列化<代码> CrtB < /代码>,您可以考虑创建<代码>类< /COD>包装该数据集,然后将其写入<代码> BytErayRouoPoStuts,然后可以反序列化包类并复制<代码> CrtB < /Cord>对象。顺便说一句,
X509v3CertificateBuilder
实际上需要编写吗?实际上,目标是在反序列化之后拥有X509v3CertificateBuilder。我想我可以将该类转换为X509v3CertificateBuilder?我还没有尝试过,不,除了
X509v3CertificateBuilder
之外,您不能将任何类型的对象强制转换为
X509v3CertificateBuilder
,但是您可以使用该类的反序列化对象字段来创建
X509v3CertificateBuilder
的新实例。再次感谢您。但问题是我不想在反序列化后创建X509v3CertificateBuilder的新实例。我想要X509v3CertificateBuilder。我想这是不可能的。。是否有其他方法可以将类写入bytearrayoutputstream并读取它?