I am trying to serialize multiple objects to a file. In particular, when I try to write
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);
This happens fine, all writeObject succeeds, and I definitely close the corresponding threads. However, when I try to recover all objects by calling readObject (), I encounter a 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
After commenting on readObject and writeObject one by one it seems that leaving P2PAuditTrailGenerator out of this allows me to read all objects successfully. Looking at this class, it seems that there are no String related objects.
public class P2PAuditTrailGenerator implements Serializable { private int num; private BigInteger phi; private BigInteger rho; 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++) {
Identifying the wrong class, and if not, what happened to my implementation?
source share