Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';“这是为什么?”;“可序列化”;接口?_Java_Serialization_Serializable_Externalizable - Fatal编程技术网

Java 什么';“这是为什么?”;“可序列化”;接口?

Java 什么';“这是为什么?”;“可序列化”;接口?,java,serialization,serializable,externalizable,Java,Serialization,Serializable,Externalizable,如果要序列化对象,只需执行以下实现: class MyClass implements Serializable { private static final long serialVersionUID = 12345L; } 而且不需要额外的努力就可以强制实现如何将对象写入和读取文件。Java只负责处理一切 另一方面,Externalizable确实定义了显式序列化和反序列化方法,因此我们可以强制编程 这就给我留下了一个问题:如果不需要为可序列化的付出额外的努力,那么让它成为我们必须实现

如果要序列化对象,只需执行以下实现:

class MyClass implements Serializable
{
  private static final long serialVersionUID = 12345L;
}
而且不需要额外的努力就可以强制实现如何将对象写入和读取文件。Java只负责处理一切

另一方面,
Externalizable
确实定义了显式序列化和反序列化方法,因此我们可以强制编程


这就给我留下了一个问题:如果不需要为可序列化的
付出额外的努力
,那么让它成为我们必须实现的接口来序列化/反序列化对象的基本原理是什么,与默认情况下每个对象都可以序列化/反序列化不同?

当程序员将一个类标记为可序列化时,他负责如果该类将来会更改,保存对象的程序将能够将它们读回更新的类。有关详细信息,请参见有效的Java项目74:明智地实现可序列化


还有另一个理由。您是否注意到
ObjectOutput.writeObject(objectobj)
接受对象,而不是可序列化的?这是因为它假定可以使用不同的序列化机制保存对象
Serializable
意味着应该使用Java标准序列化保存对象

接口Serializable仅用作标识的掩码 具有被序列化的能力,那么每个类都需要维护serialVersionUID以避免版本冲突。此外,它可能会导致安全问题:尽管有人会将其用作创建新对象的方式 对象不是由客户端代码创建的。使用可序列化接口不安全。有关详细信息,请参阅有效Java

因为:

  • 并不是所有对象都具有有意义的语义。示例:单例对象
  • 安全。如果您将对象传递给其他人的代码,而他们总是可以捕获并传输该对象,那么就需要选择退出与安全相关的代码,当人们忽略某个对象时,就会出现安全漏洞。因此,“默认关闭”更安全
  • 内置的序列化格式会写出您编写的每个对象的类名,因此效率非常低。仅在数据很少的非常简单的情况下使用它
  • 默认序列化不容易与其他语言编写的代码共享数据,因此如果今天编写的数据将来可能需要由其他软件读取,则应考虑使用特定的表示形式。所以这不是一个好的长期模式
  • 并非所有开发人员都清楚地记住了它在所有情况下如何工作的确切规则

  • 如果您阅读Joshua Bloch的《高效Java》一书,它将解释使用内置功能有多么棘手。大多数开发人员在很多情况下都避免使用它。这个答案提供了一个很好的经验法则

    很好的问题。在Python中,默认情况下所有内容都是可序列化的。这里可以找到答案:您的意思是
    ObjectOutput.writeObject()
    ObjectOutputStream.writeObject()
    。我的意思是接口ObjectOutput,ObjectOutputStream。writeObject(Object)只接受序列化