2012-10-10 73 views
4

我想序列化一些对象到一个文件。特别是,当我尝试写java序列化导致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); 

这样呢OK,所有的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 

注释掉readObjectwriteObject一一之后,似乎离开P2PAuditTrailGenerator出这个让我成功读取所有对象。看看这个类,看起来没有字符串相关的对象。

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

我是错误的类,如果没有,我的实现有什么问题?

+0

嗨你解决了这个问题吗?我面对同样的,需要帮助。克里斯说我的班级没有参数构造函数。 – Amogh

回答

1

我猜你声明P2PAuditTrailGenerator可序列化,但它并没有一个无参数的构造函数。其他一切看起来都OK。

+2

为什么没有参数的构造函数很重要? – goh

+0

序列化要求类或其父母之一有一个无参数构造函数。不会伤害添加它,看看它是否改善了事情。否则,您需要通过注释readObject和writeObject中的行来查看哪些实例变量导致了问题。 –