2012-10-10 4 views
4

J'essaie de sérialiser un certain nombre d'objets dans un fichier. réussissons tous les writeObject En particulier, lorsque je tente d'écriresérialisation java provoque utfdataformatexception

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); 

Cela arrive ok, et je ferme les flux correspondants fidèlement. Cependant, lorsque je tente de reconstruire en arrière tous les objets en appelant readObject(), je rencontrais le 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 

Après avoir commenté le readObject et writeObject un par un, il semble que le départ P2PAuditTrailGenerator de ce qui me permet lire dans tous les objets avec succès. En regardant cette classe, il semble qu'il n'y a pas d'objets liés à la chaîne.

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

id-ing Am la classe mal ou sinon, quel est le problème avec ma mise en œuvre?

+0

Hey avez-vous résolu ce problème? Je fais face à la même chose, j'ai besoin d'aide. Ma classe a un constructeur sans argument comme Chris l'a dit. – Amogh

Répondre

1

Je devine que vous avez déclaré P2PAuditTrailGenerator être sérialisable, mais il ne dispose pas d'un constructeur sans argument. Tout le reste semble OK.

+2

Pourquoi un constructeur sans argument est-il important? – goh

+0

La sérialisation nécessite l'existence d'un constructeur sans argument sur la classe ou l'un de ses parents. Ça ne ferait pas de mal de l'ajouter pour voir si ça améliore les choses. Sinon, vous devrez passer en revue et commenter les lignes dans readObject et writeObject pour voir quelles variables d'instance causent le problème. –