Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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 - Fatal编程技术网

Java 什么是序列化及其工作原理

Java 什么是序列化及其工作原理,java,serialization,Java,Serialization,可能重复: 我知道序列化过程,但还没有实现它 在我的应用程序中,我看到有各种各样的类已经通过serilizable接口实现。考虑以下类别 public class DBAccessRequest implements Serializable { private ActiveRequest request = null; private Connection connection = null; private static Log log = LogFactory.g

可能重复:

我知道序列化过程,但还没有实现它

在我的应用程序中,我看到有各种各样的类已经通过serilizable接口实现。考虑以下类别

public class DBAccessRequest
implements Serializable
{
    private ActiveRequest request = null;
    private Connection connection = null;
    private static Log log = LogFactory.getLog(DBAccessRequest.class);

    public DBAccessRequest(ActiveRequest request,Connection connection)
    {        
        this.request = request;
        this.connection = connection;
    }

    /**
     * @return Returns the DB Connection object.
     */
    public Connection getConnection() {
        return connection;
    }

    /**
     * @return Returns the active request object for the db connection.
     */
    public ActiveRequest getRequest() {
        return request;
    }
}
只需在构造函数中设置请求和连接,并为它们设置getter setter。 那么这里的可系列化实现有什么用呢…

来自:

我们都知道Java平台允许 我们将在中创建可重用对象 记忆。但是,所有这些对象 仅当Java虚拟机存在时才存在 机器1仍在运转。是的 如果我们创建的对象可以 存在于生命周期之外 虚拟机,不是吗?好, 通过对象序列化,您可以 展平对象并在中重用它们 强大的方式

因此,我认为将其标记为可序列化的原因是,一旦JVM启动并再次运行,以前使用的数据将被加载并再次使用。这可能很有用,以避免用户每次加载应用程序时都输入相同的数据。

这就是所谓的标记接口;它用于定义Java中可序列化的类型。从API:

:实现[this]接口的类启用了类的可序列化性。未实现此接口的类的任何状态都不会序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义

另见:
  • 有效Java第二版,第11章:序列化。
    • 第37项:使用标记接口定义类型

Rozer,我想你的意思是为什么类被标记为可序列化,并且除了getter和setter之外,没有与序列化相关的功能

该类可能不会直接实现可序列化函数

  • 派生DBAccessRequest类的类可能实现它们;或
  • 可能需要序列化具有DBAccessRequest实例的类,这使得DBAccessRequest必须是可序列化的

  • 对此我没有任何其他解释。

    外行会说:“可序列化?这是如何告诉Java,我需要将此对象拆分为字节并安全地存储在其他地方,反之亦然”

    序列化比保存一些本机变量(如int、long、,等等,进入一条你字面上称之为它们的溪流

    int i=100;
    stream.write(i);
    
    关于序列化,每个可序列化对象都有一个对每个可序列化对象唯一的serialVersionUID,并且通过反射+一个非常复杂的机制(防止再次保存对象的同一实例),它分解对象并将其保存为字节,就像我的示例一样,只有一个预定义的非常通用的机制可以做到这一点

    这意味着,在您的示例中,它将查看DBAccessRequest对象检查存在哪些变量,如果它们也是可序列化的,它将对它们执行相同的过程,并将它们切分为可序列化的核心,并将它们保存为字节

    这是一个隐喻,用来解释一个非常复杂、非常有趣且值得研究的过程的一般概念(你也应该查一下):

    希望这有帮助,


    亚当。

    见。实现Serializable告诉运行时类可以安全地序列化。感谢Bdhar,这意味着您想说拥有DBAccessRequest对象的类需要序列化,所以我们正在这样做(在DBAccessRequest中实现Serializable),但这不是这里的情况,我看到许多类使用相同的场景。还是很困惑。。好的,你能帮我任何场景,我可以使用serializable,可以看到一切,这样图片会更清晰,再次感谢