2013-09-21 103 views
2

我有一个对象,我想序列成字节码:Java对象序列化java.io.UTFDataFormatException

public class objektserial implements Serializable { 

private static final long serialVersionUID = 1L; 
private String msg =""; 
private LinkedList<String> stringlist = new LinkedList<String>(); 

public objektserial(String nachricht) { 
this.msg = nachricht; 
this.stringlist = new LinkedList<String>(); 
} 

public objektserial(){  
} 

public String getMsg(){ 
return msg; 
} 

public void setList(LinkedList<String> list){ 
this.stringlist = list; 
} 
} 

我的想法:1。 序列化 2.加密字节码 3.加密字节代码 4.反序列化

// Serialization 
objektserial os = new objektserial(textField.getText()); 
LinkedList<String> list = new LinkedList<String>(); 
for (int i = 0; i < 10; i++) 
    list.add("String Nr. " + i); 
os.setList(list); 

try { 
    FileOutputStream file = new FileOutputStream("objekt.objs"); 
    ObjectOutputStream o = new ObjectOutputStream(file); 
    o.writeObject(os); 
    o.close(); 
} catch (IOException ex) { 
    System.err.println(e); 
} 

// Encrypt 
try { 
    BufferedReader in = new BufferedReader(new FileReader("objekt.objs")); 
    String s = ""; 
    String text = ""; 
    while ((s = in.readLine()) != null) { 
     text += s; 
    } 
    String passwordEnc = AESencrp.encrypt(text); 
    String passwordDec = AESencrp.decrypt(passwordEnc); 
    File file = new File("objekt.objs"); 
    FileWriter fw = new FileWriter(file, false); 
    BufferedWriter writer = new BufferedWriter(fw); 

    writer.write(passwordEnc); 

    writer.close(); 

    System.out.println("Plain Text : " + text); 
    System.out.println("Encrypted Text : " + passwordEnc); 
    System.out.println("Decrypted Text : " + passwordDec); 
    } catch (Exception eiasdasd) { 
    } 

// Decrypt 
try { 
     BufferedReader in = new BufferedReader(new FileReader("objekt.objs")); 
    String s = ""; 
    String text = ""; 
    while ((s = in.readLine()) != null) { 
     text += s; 
    } 
    String passwordDec = AESencrp.decrypt(text); 
    File file = new File("objekt.objs"); 
    FileWriter fw = new FileWriter(file, false); 
    BufferedWriter writer = new BufferedWriter(fw); 

    writer.write(passwordDec); 

    writer.close(); 

    System.out.println("Plain Text : " + text); 
    System.out.println("Encrypted Text : " + text); 
    System.out.println("Decrypted Text : " + passwordDec); 
} catch (Exception eiasdasd) { 
} 

// Read&Dezerialize 
try { 
FileInputStream file = new FileInputStream("objekt.objs"); 
ObjectInputStream o = new ObjectInputStream(file); 
objektserial obs = (objektserial) o.readObject(); 
o.close(); 
textField_1.setText(obs.getMsg()); 
} catch (IOException e) { 
    System.err.println(e); 
} catch (ClassNotFoundException e) { 
    System.err.println(e); 
} 

这工作正常,但如果我的序列化对象过大(超过一行,如果我用记事本打开++中的字节码文件),我得到一个"java.io.UTFDataFormatException"

我得到java.io.UTFDataFormatException当我尝试反序列化&阅读再次解密的文件...

我能做些什么来解决这个问题?

+1

上面的代码有很多错误。您正在读取和写入同一个文件,您不需要中间文件。您将二进制(字节数组)视为字符串值,反之亦然。我没有看到任何解密方法。修复缩进并遵守Java风格指南也会有很多帮助。我的建议是重新开始并创建单独的部分来完成文件写入,编码/解码,字符编码解码和加密/解密*并单独测试*。 –

回答

1

您正在使用ObjectStream.writeObject()编写代码。你需要用ObjectInputStream.readObject()来读取。

序列化对象不是行。它们也不是字符数据,它排除了读者。

+0

我正在阅读ObjectInputstream(请参见上一个Methode)。 我正在阅读仅用于加密和解密的行。 但问题就解决了: - 只是不得不在加密和解密时+ “\ n” 而((S = in.readLine())!= NULL){ 文字+ = S +“\ n添加“; } 现在它工作完美,即使是更大的物体! :) –

+0

您正在阅读和引用BufferedReader in = new BufferedReader(new FileReader(“objekt.objs”);'。由于我已经给出的原因,这是无效的。您需要读取并加密*字节。* – EJP

+0

@EJP读取和*解密*字节:P –