为什么我应该在java中使用Serialization而不是File I / O.

时间:2012-03-22 11:54:44

标签: java serialization java-io

在序列化机制中,我们使用objectinputstream和object outputstream将对象写入流中。这些对象通过网络传输。在此机制中使用Object输入/输出流。所以我可以使用File INPUT / OUTPUT Streams而不是调用序列化标记界面?。

7 个答案:

答案 0 :(得分:2)

我猜你正在混淆序列化和通用I / O.

序列化是一种将对象转换为字节序列(返回,称为反序列化)的方法。这样,您就可以通过网络传输可序列化的对象并将它们存储到文件中。

文件输入/输出流用于存储/从文件中读取任何类数据。

答案 1 :(得分:1)

当您需要在网络上传输对象时,需要对其进行序列化。以下链接可能对您有用。

http://java.sun.com/developer/technicalArticles/Programming/serialization/

答案 2 :(得分:1)

文件I / O和序列化是两回事。文件I / O用于读/写文件。序列化接口用于对象的二进制解释。所以不,你不能使用文件流来通过网络发送。(可能有一些使用文件流通过网络发送数据的解决方法,但它就像试图用汽车飞行)

答案 3 :(得分:1)

首先让我们专注于定义: 序列化:这是将对象状态转换为可以以相同方式存储和重建的格式的过程。

而在文件I / O 中,它可以存储数据结构或对象,然后以相同的方式重建。 这就是我们使用序列化或数据库查询方法(如sql,mongodb)的原因。

JSON / XML也可以使用其解析器进行序列化。

举一个javascript的例子(不是java,但是把它当作语言不可知):

var obj = { // it's an object in javascript (same like json) a: "something", b: 3, c: "another" };

现在,如果您尝试使用此文件i / o保存在文件中(例如abc.txt),它将保存为字符串 这意味着以后可以通过读取此文件(abc.txt)来访问其他代码:

// readThisFile();

// obj.a;

但是如果你使用序列化(在本机使用JSON的javascript中),你可以从文件中读取它

答案 4 :(得分:0)

由于流是添加剂,您可以执行类似

的操作
FileOutputStream fos = new FileOutputStream("/some/file/to/write/to");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(someObject);

不确定这是你问的问题,但很难说。

答案 5 :(得分:0)

序列化/反序列化用于读取和写入对象,这不仅会产生压缩数据,这些数据是不可读的,但也会以二进制形式写入。文件I / O用于读写。您似乎不想序列化,如果不这样做,请不要使用它。用文本读写文件。

答案 6 :(得分:0)

  

在序列化机制中,我们使用将对象写入s流   ObjectInputStreamObjectOutputStream

确定

  

这些对象通过网络传递。在这种机制中使用a   ObjectInput / Output流。

我跟着你。

  

我可以使用文件输入/输出流而不是调用   序列化标记界面?。

在这里你失去了我。您的意思是通过网络发送对象还是只是序列化它?

当然,您可以使用任何输入/输出流以及ObjectInput / ObjectOutput流将对象序列化到不同的媒体。

例如:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("jedis.bin"));
out.writeObject(new Jedi("Luke"));

将对象序列化为名为jedis.bin

的文件

代码

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOputStream out = new ObjectOutputStream(byteStream);
out.writeObject(new Jedi("Luke"));

将对象序列化为内存数组。

因此,任何输出/输入流都可以用作ObjectInput / ObjectOutput流使用的基础流。