【问题标题】:Java Object Serialization java.io.UTFDataFormatExceptionJava 对象序列化 java.io.UTFDataFormatException
【发布时间】:2013-09-21 00:23:40
【问题描述】:

我有一个对象,我想序列化成字节码:

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

这很好,但如果我的序列化对象太大(超过一行,如果我用 Notepad++ 打开字节码文件),我会得到一个"java.io.UTFDataFormatException"

当我再次尝试反序列化和读取解密文件时,我得到了java.io.UTFDataFormatException...

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

【问题讨论】:

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

标签: java exception serialization encryption


【解决方案1】:

您正在使用 ObjectStream.writeObject() 进行写作。您需要使用 ObjectInputStream.readObject() 进行阅读。

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

【讨论】:

  • 我正在使用 ObjectInputstream 阅读(参见最后一个方法)。我正在阅读仅用于加密和解密的行。但问题解决了: - 只需在加密和解密时添加 +"\n" while ((s = in.readLine()) != null) { text += s+"\n";现在它可以完美运行,即使是更大的对象! :)
  • 您正在阅读,我引用BufferedReader in = new BufferedReader(new FileReader("objekt.objs");。由于我已经给出的原因,这是无效的。您需要读取和加密 字节。
  • @owlstead 加密。他有一个读取文件并对其进行加密的后处理。请阅读问题。它可能是原始过程的一部分,带有 CipherOutputStream。他还需要将密文写成字节而不是字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
相关资源
最近更新 更多