存储在文件中的序列化对象不可读

时间:2016-05-26 06:45:52

标签: java serialization

问题在于,当我将序列化对象存储在.txt文件中时,它不是可读形式,并且包含一些随机符号和字母。首先,我想知道背后的原因是什么,然后如何解决这个问题。

好的所以这是我的代码:我要序列化的对象

package serialized;

import java.io.Serializable;
import javax.swing.JOptionPane;

public class Student implements Serializable {

private static final long serialVersionUID = 1L;
String s_name;
int roll_no;

public Student(String s_name, int roll_no){
    this.s_name=s_name;
    this.roll_no=roll_no;
}

public void getInfo(){
    JOptionPane.showMessageDialog(null, "Name: "+s_name+" Roll No: " + roll_no);
}
}

序列化

package serialized;
import java.io.*;
public class StudentWriter {

public static void main(String[] args) {
    Student s1=new Student("Asiya", 58);
    try{

        FileOutputStream fos=new FileOutputStream("abc.txt");
        ObjectOutputStream oos=new ObjectOutputStream(fos);

        // Writing Object Info to File
        oos.writeObject(s1);
        System.out.println("Data has been written to file");
        oos.close();
        fos.close();

    }catch(Exception e){
        e.printStackTrace();
    }

}

}

反序列化

package serialized;
import java.io.*;
public class StudentReader {

public static void main(String[] args) {

    try{
        FileInputStream fis=new FileInputStream("abc.txt");
        ObjectInputStream ois=new ObjectInputStream(fis);

        // Reading Data from File
        Student s_data=(Student)ois.readObject();
        System.out.println("Data has been read");
        s_data.getInfo();

        ois.close();
        fis.close();

    }catch(Exception e){
        e.printStackTrace();
    }

}

}

输出:

 ’ sr serialized.Student        I roll_noL s_namet Ljava/lang/String;xp   :t      Asiya

2 个答案:

答案 0 :(得分:1)

存储在文件中的序列化对象(Java中)并不意味着人眼可读。如果要读取文件,则需要使用Java程序执行此操作。

答案 1 :(得分:1)

  

存储在文件中的序列化对象不可读

除了通过反序列化之外,它们不是可读的。

  

问题在于,当我将序列化对象存储在.txt文件中时,它不是可读形式,并且包含一些随机符号和字母。

这不是问题。唯一的问题是你错位的期望它应该是人类可读的。在任何地方都没有说明。

  

首先,我想知道背后的原因是什么

它在Object Serialization Stream Protocol

中指定
  

然后如何解决这个问题。

有什么问题?您的代码正常运行。 StudentReader放置的对话框中的输出是正确的:

Name: Asiya Roll No: 58

您在此处完成所做的事情是使用某个实用程序直接查看序列化文件,而不是运行您的StudentReader程序。

这里没有问题需要解决。

NB:

  1. 关闭对象流会关闭基础文件流。您不需要自己关闭文件流。
  2. 序列化对象不是文本,不应保存在.txt文件中。