【问题标题】:Serialzed Objects Stored in File are not readable存储在文件中的序列化对象不可读
【发布时间】:2016-05-26 06:45:52
【问题描述】:

问题是,当我将序列化对象存储在 .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

【问题讨论】:

  • 我不理解 -3... 我只是想知道为什么输出会出现这样的情况。
  • 它对我来说工作正常.. @SyedaNaqvi

标签: java serialization


【解决方案1】:

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

它们并不意味着可读,除了通过反序列化。

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

这不是问题。唯一的问题是您错误地期望它应该是人类可读的。任何地方都没有这样说的规范。

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

Object Serialization Stream Protocol中指定。

然后是如何解决这个问题。

什么问题?您的代码工作正常。 StudentReader弹出的对话框输出正确:

Name: Asiya Roll No: 58

您在此处清楚地所做的是使用一些实用程序直接查看序列化文件,而不是运行您的StudentReader 程序。

这里没有问题要解决。

注意:

  1. 关闭对象流会关闭底层文件流。您无需自行关闭文件流。
  2. 序列化对象不是文本,不应保存在 .txt 文件中。

【讨论】:

  • 是的,我正在查看 txt 文件。因为我的任务是:序列化的对象应该以正确的格式出现在 txt 文件中。
  • 定义“正确的格式”。如果你被要求使用Serialization 来生成一个文本文件,更不用说一个可读的文本文件,你的分配是完全没有意义的,因为这不是序列化所做的。如果您被要求查看文本文件,StudentReader 类的目的是什么?这没有意义。你需要检查你的作业实际上说了什么。
  • 正如我已经定义的那样:分配是:为什么它在 .txt 文件中不是人类可读的格式?
  • 我无法相信您正确解释了您的作业。请在您的问题中发布确切的措辞。它不是人类可读的,因为没有任何规范表明它应该是人类可读的。我在答案中提供了一个链接,解释了格式。
  • 好的。我明白。感谢您的努力。
【解决方案2】:

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

【讨论】:

  • 这不是Java程序吗..?
  • @SyedaNaqvi 是的,但你没有运行它,是吗?
  • 我已经运行了你的程序。它能够读取您存储在文件中的数据。但是,如果您使用记事本或任何其他文本编辑器打开文件,则内容对人眼没有意义。您的程序在从文件中读取序列化对象时百分百正确。
  • 我当然会运行这段代码。我从来没有说过代码中有错误,我是在询问存储序列化对象的 .txt 文件。那里的格式不正确
  • @SyedaNaqvi 它肯定是“正确的格式”,您的阅读器代码正确执行的事实证明了这一点。这里唯一的问题是您的错误期望。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2019-01-08
  • 2021-07-26
  • 2017-12-30
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多