假设我们有一个类
Class A implements serializable{
String s;
int i;
Date d;
public A(){
}
public A(String s, int i, Date d){
this.s =s;
blah blah
}
}
现在让我们说一种方法,我将 s、i、d 的所有内部值存储到文件中并再次读取它们,然后将它们传递给构造函数并创建一个新对象。其次,我序列化然后反序列化为一个新对象。这两种方法的基本区别是什么?
我知道序列化会很慢且安全,而另一种方法则不然。任何其他差异。
最佳答案
读这篇文章,很好地解释了序列化是什么(它是针对Java RMI的,但序列化解释和问题是相同的):http://oreilly.com/catalog/javarmi/chapter/ch10.html
我看到的主要区别是:
- (正如其他答案所说)您负责序列化 - 反序列化。当其中一个属性是另一个大的复杂类时会发生什么?那你要做什么?也保存它的值(value)吗?
- 序列化依赖于反射,而文件依赖于 getters/setters/constructors。通过反射,您不需要公共(public) setter/getter 或带参数的构造函数。有了文件,你就需要它们。
摘自上面的链接:
使用序列化
序列化是一种内置于核心 Java 库中的机制,用于将对象图写入数据流。然后可以通过编程方式操作该数据流,并且可以通过反转该过程来制作对象的深拷贝。这种逆转通常称为反序列化。
特别地,序列化有三个主要用途:
- 作为持久性机制。如果使用的流是
FileOutputStream
,那么数据将自动写入文件。 - 作为复制机制。如果使用的流是ByteArrayOutputStream,那么数据将被写入内存中的字节数组。然后可以使用该字节数组创建原始对象的副本。
- 作为一种沟通机制。如果正在使用的流来自套接字,那么数据将自动通过线路发送到接收套接字,此时另一个程序将决定要做什么。
需要注意的重要一点是,序列化的使用与序列化算法本身无关。如果我们有一个可序列化的类,我们可以将其保存到文件中或通过更改使用序列化机制输出的方式来制作它的副本。
关于java - 序列化和反序列化以及将内部写入文件然后读取它们并将它们传递给构造函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3131694/