java序列化导致utfdataformatException

goh*_*goh 5 java serialization

我正在尝试将多个对象序列化到一个文件中。特别是,当我尝试写时

public void execute(PipelineContext context) throws Exception {
        FileOutputStream fos = new FileOutputStream("test_audit_trail2.objects");
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        BigInteger rho = (BigInteger) context.get("rho");
        BigInteger p = (BigInteger) context.get("p");
        BigInteger xS = (BigInteger) context.get("xs");
        BigInteger zSBar = (BigInteger)context.get("zsbar");

        int nS  = (Integer) context.get("ns");
        P2PShuffler ownShuff = (P2PShuffler) context.get("shuffler");
        HexCryptor cryptor = (HexCryptor) context.get("cryptor");
        String[] PRPrimePrimeBar = (String []) context.get("pr_prime_prime_bar");
        P2PAuditTrailGenerator ownATG = (P2PAuditTrailGenerator) context.get("p2p_audit_trail_generator");
        int kS = (Integer) context.get("ks");

        oos.writeObject(rho);
        oos.writeObject(p); 
        oos.writeObject(xS);
        oos.writeObject(zSBar);
        oos.writeObject(ownShuff);
        oos.writeObject(cryptor);
        oos.writeObject(PRPrimePrimeBar);
        oos.writeObject(ownATG);
        oos.writeObject(nS);
        oos.writeObject(kS);
Run Code Online (Sandbox Code Playgroud)

这种情况发生正常,所有 writeObject 都成功,并且我忠实地关闭了相应的流。然而,当我尝试通过调用 readObject() 重建所有对象时,我遇到了UTFDataFormatException

java.io.UTFDataFormatException
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFSpan(ObjectInputStream.java:3081)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3006)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2819)
        at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1050)
        at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:614)
        at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:808)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1564)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
        at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1911)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1873)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
        at edu.foo.peer.pipeline.AuditTrailCheckStageTest.setUp
Run Code Online (Sandbox Code Playgroud)

在逐一注释掉readObject和后,似乎省略了这一点可以让我成功读入所有对象。看这个类,好像没有String相关的对象。writeObjectP2PAuditTrailGenerator

public class P2PAuditTrailGenerator implements Serializable {

    private int num;
    private BigInteger phi;
    private BigInteger rho;
    /**
     * @param   auditTrailSecretKeys    The secret keys used for audit trail
     */
    private BigInteger[] auditTrailSecretKeys;
    private BigInteger[] encAuditTrails;
    private Random rnd;

    public BigInteger [] getAuditTrailSecretKeys(){
        return auditTrailSecretKeys;
    }


    public P2PAuditTrailGenerator(int num, BigInteger rho, BigInteger phi) {
        this.num = num;
        this.phi = phi;
        this.rho = rho;
        auditTrailSecretKeys = new BigInteger[num];
        encAuditTrails = new BigInteger[num];
        rnd = new Random();

    }

    public BigInteger[] generateATs() {

        for (int i = 0; i < num; i++) {
            //assuming the security parameter is always 512 or 1024;
            auditTrailSecretKeys[i] = new BigInteger(200, rnd).mod(phi);
            encAuditTrails[i] = rho.modPow(auditTrailSecretKeys[i], phi);

        }
        return encAuditTrails;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否 id-ing 错误的类,或者如果不是,我的实现有什么问题?

Chr*_*ken 1

我猜您已声明 P2PAuditTrailGenerator 可序列化,但它没有无参数构造函数。其他一切看起来都不错。

  • 为什么无参数构造函数很重要? (2认同)