什么是可序列化对象?

Posted

技术标签:

【中文标题】什么是可序列化对象?【英文标题】:What is a serializable object? 【发布时间】:2010-11-21 04:43:14 【问题描述】:

什么是 C# 中的可序列化对象? 我想可序列化这个词比“可序列化对象”更让我失望。

【问题讨论】:

【参考方案1】:

通常对象是随机访问,也就是说,您可以指定对象的任何部分(属性或字段)并直接访问该部分。如果您使用 RAM 来存储对象,这一切都很好,因为 RAM 是 Random Acess Memory,因此适合去工作。

当您需要将对象存储在传统上不是随机访问的介质上时,例如 disk,或者您需要通过 stream 介质传输对象(如网络),则需要将对象转换为适合相关媒体的形式。这个转换过程称为序列化,因为结构化对象被扁平化或序列化,使其更适合长期存储或通过网络传输。

为什么不直接将构成 RAM 中对象的位复制到磁盘,或者将其作为不透明的 blob 通过网络发送? ……你可能会问。几个问题:

    对象存储在内存中的格式通常是专有的,因此不适合公共使用 - 对象存储在内存中的方式已针对内存使用进行了优化。 当一个对象引用其他对象时,这些引用仅在正在运行的应用程序的上下文中才有意义。除非在序列化过程中,对象图被相应地遍历和序列化,否则不可能有意义地反序列化对象。可能需要将这些引用翻译成具有应用程序实例上下文之外的意义的形式。 异构系统之间可能存在互操作性要求,在这种情况下,需要一种表示对象的标准方法(通常为此选择某种形式的 XML)。

【讨论】:

作为一个新手,我认为你不能给出更好的答案。【参考方案2】:

可以转换为位并存储在介质(例如硬盘驱动器)上的对象。 http://en.wikipedia.org/wiki/Serialization

【讨论】:

你能提供一个不能序列化的对象的例子吗? 从技术上讲,任何未通过某种语言结构或方法序列化的对象都是不可序列化的。如果你想要一个你通常不会序列化的对象的例子,那么一般的想法是“你不需要/想要保存的任何东西”。在 MVC 设计模式中,您通常不会序列化视图,因为控制器应该指示视图做什么(因此您将序列化模型和控制器)。 作为一个不可可序列化的例子,考虑在没有相同环境的机器上重建将非常困难,如果不是不可能的话。例如,ResultSet 不可序列化,因为它们可以保持与数据库的连接。【参考方案3】:

对象序列化存储实例的状态,以便您以后可以再次重建该实例。

在大多数(C# 和 Java)中,可序列化对象是“标记的”。在 Java 中,您需要实现 Serializable。在 C# 中,您需要使用 [Serializable]。

对象序列化后,您可以将其存储在文件中或通过网络发送。

把它想象成遍历一个实例的每个实例变量并存储它的值,用一些分隔符分隔(尽管它比这要复杂得多;想想如果你有非原始类型的实例变量会发生什么,您还必须将所有值存储在其中)。

它的一个用途是保存游戏。

【讨论】:

【参考方案4】:

序列化通常意味着将对象状态保存为“可保存”格式(如保存到磁盘),以便以后可以将其反序列化为实际对象。在远程调用的情况下,通常还通过网络发送对象。如果您不想保存并且不想通过网络发送对象,则可以忽略可序列化部分(在 Java 中,您不实现可序列化接口)

【讨论】:

【参考方案5】:

您可以在 C# 中将对象标记为 [serializable],这意味着它可以在 .net 中转换为二进制、SOAP、XML。

这样做的好处是您可以序列化一个对象,通过互联网、网络等发送它,然后在另一端再次将其恢复为对象。然后,这可以跨越机器边界,例如 Windows 机器到 Unix 机器,只要另一端的计算机能够读取数据并对其进行反序列化。

请看这篇文章: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=236

【讨论】:

【参考方案6】:

除了已经说过的,我认为重要的是要提到数据的序列化意味着给它一个明确定义的顺序(序列来自系列,这意味着有一些东西排列 排队)。

例如,将图(例如,从“语义网”中得知的 RDF 图)序列化为 XML 等序列化格式意味着必须有一个规则集来定义如何将图中包含的信息按顺序排列,以便以后可以通过应用反向序列化规则(反序列化)对其进行重构。

【讨论】:

【参考方案7】:

序列化:一种将对象转换为二进制格式、简单对象访问协议(SOAP)或易于存储、传输和检索的xml文档的技术。

以简单的方式序列化方式,我们可以压缩和解压缩数据并以安全的方式跨网络传输数据。

对象序列化是 ljuwaidah 解释的。 也试试这个链接 link text

【讨论】:

【参考方案8】:

由于 Java 是一个独立于平台的平台,它是为安全目的而发明的,所以所有事情都可能以比特的形式出现。例如,作为用户,我们非常了解字母,但很难记住这些字母的位,或者我们可以用那个 Java 语言字符串说。 因此,为了在网络中提供安全性,我们使用对象。 由于消息是有损耦合的,为了提供安全性,我们使用对象从服务器或客户端发送或接收消息。因此,当我们使用对象时,对象必须是可序列化的,这意味着它们必须采用机器易于理解的位形式。 特别是发送和接收消息被称为JMS(Java Message Service)。例如,在印度的一台计算机可能想与当时在美国的另一台计算机通信,使用 JMS 服务。

简而言之,序列化意味着将字符串转换为位。

通过使用它,我们可以创建Java程序,例如使用基于SMTP(简单邮件传输协议)协议的邮件应用程序来发送和接收邮件。

【讨论】:

当问题是关于 C# 时,为什么你的答案是关于 Java 的?

以上是关于什么是可序列化对象?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在javascript中序列化任何类对象?

C# 将object类型对象(注:必须是可序列话的对象)转换为二进制序列字符串

为什么JAVA对象需要实现序列化?

什么是序列化?在什么情况下将类序列化?

为什么要实现Serializable

什么是Java序列化,如何实现java序列化