.NET 二进制序列化对象并引用其他对象。 。 。会发生什么?

2023-12-09

如果您有一个引用其他对象(例如实例 B 和 C)的对象实例 A,并且您将 A 二进制序列化到文件中,会发生什么情况?您现在有包含 A、B 和 C 的序列化数据吗?

它到底是如何运作的?如果我反序列化数据会得到什么?甲、乙、丙??

(也请随意包含内部工作原理解释)。


对其他对象的所有引用也将被序列化。如果反序列化数据,您最终将得到一个完整的、可工作的数据集,包括对象 A、B 和 C。这可能是二进制序列化相对于 XML 序列化的主要好处。

如果您的对象持有的任何其他类没有标记为[Serializable]属性,你会得到一个SerializationException在运行时(其图像是无耻地从网络上窃取的;在当前版本的 VS 中,运行时错误甚至不再像这样了):

    Example of an unhandled SerializationException

除此之外,我不太确定您希望了解什么“内部事物”。序列化用途反射遍历对象的公共和私有字段,将它们转换为字节流,最终写入数据流。在反序列化期间,会发生相反的情况:从数据流中读入字节流,该字节流用于合成对象的精确副本以及类型信息。对象中的所有字段都具有与之前相同的值;构造函数是not当对象被反序列化时调用。最简单的思考方法是,您只需采取就地快照的物体,你可以随意恢复到原来的状态。

负责实际序列化和反序列化的类称为格式化程序(它总是继承自IFormatter界面)。它的工作是生成一个“对象图”,它是一个广义树,其中包含正在序列化/反序列化的对象作为其根。如上所述,格式化程序使用反射来遍历该对象图,序列化/反序列化该对象包含的所有对象引用。格式化程序也足够智能,知道不要多次序列化图中的任何对象。如果两个对象引用实际上指向同一个对象,则会检测到这一点,并且该对象只会被序列化一次。这个逻辑和其他逻辑可以防止进入无限循环。

当然,很容易对这个过程的工作原理有一个很好的总体了解。它是much自己实际编写实现它的代码更困难。幸运的是,这已经为您完成了。 .NET Framework 的部分优点是所有这些复杂的序列化逻辑都是内置的,让您无需担心。我并不声称自己了解所有内容,而且您当然也不需要了解它即可充分利用它提供的功能。多年手工编写所有代码的经历终于结束了。您应该感到高兴,而不是担心实现细节。 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 二进制序列化对象并引用其他对象。 。 。会发生什么? 的相关文章

随机推荐

  • 如何在 Emacs Elisp 中获得类似格式化的 LSP?

    这是我在 Rust 开发中经常使用的一个场景 Rust LSP 始终开启 我将 LSP 功能称为 格式化当前缓冲区 或其他名称 LSP 返回格式化的缓冲区 LSP 在内部使用rustfmt 由于 Emacs Elisp 没有 LSP 实现
  • 将带有换行符的TextArea数据存储在数据库中并以与换行符相同的格式显示

    我有一个带有文本区域 HTML 组件的 JSP 页面 当用户在文本区域中输入时按 Enter 键并转到下一行 并且单击 保存 按钮时 会将文本区域中的数据保存到数据库中 但是当我加载数据库的内容时 换行符消失了 方法 HELLO WORLD
  • Java 中的 ^ 运算符有什么作用?

    有什么功能 插入符号 运算符在 Java 中服务 当我尝试这个时 int a 5 n 它给了我 对于 n 5 返回 0对于 n 4 返回 1对于 n 6 返回 3 所以我猜它不执行求幂 但那又是什么呢 Java 中的 运算符 在Java中是
  • 查找具有 3 个或更多连续相同值的记录

    我的表中有一个日期交易列表 其中包含日期 客户编号 交易类型和价值 如果该客户按日期排序时连续有 3 个或更多连续 现金 交易 我需要返回该客户的所有交易 因此 在下面的示例数据中 我想返回客户 1 和 3 的所有交易 包括信用交易 因为这
  • 如何获取当前类中的方法名称

    你好 在我的 java 类 Toto 中 我有 3 个静态方法 我想知道当我使用这些方法之一时 如何在 try catch 块中获取并显示 package class methode 的名称 我在方法A中尝试过 public static
  • 如何使用 Amazon AMI 在 Amazon AWS EC2 或 EMR 上安装 GUI

    我需要运行一个需要 GUI 界面来启动和配置的应用程序 我还需要能够在 Amazon 的 EC2 服务和 EMR 服务上运行此应用程序 EMR 要求意味着它必须在 Amazon 的 Linux AMI 上运行 经过大量搜索后 我无法找到任何
  • 如何返回两个字符串是否仅大小写不同?

    我正在编写一个方法 其输入是两个字符串 该方法应返回三个值之一 1当字符串具有完全相同的值 其字符的 Unicode 值 时 0当字符串具有完全相同的值 除了基本拉丁语 ASCII 字符大小写不同之外 时 并且 1否则 我有 public
  • 使用spring security告诉ajax请求登录页面在哪里

    我有一些用 spring 保护的 url 通过 xml 配置 有用 但是 当我尝试使用 ajax 请求访问该端点时 我收到 302 已找到 响应 这将我的 ajax 调用重定向到登录页面 因此我获取了 html 不过 我希望获得 401 未
  • 如何在Startup.cs中注册通用类型的接口

    我在 ASP NET Core 中使用 Web API 这有效 services AddScoped
  • 有没有办法只将样式应用于 Safari?

    我正在尝试找到一种将 CSS 仅应用于 Safari 的方法 但我发现的所有内容也适用于 Chrome 我知道这些目前都是 WebKit 浏览器 但我在 Chrome 和 Safari 中遇到了 div 对齐问题 每个显示都不同 我一直在尝
  • 使用 Rmpfr/gmp 库,x>170 的阶乘(x)

    我想解决的问题是以下函数的无限和 对于总和 我使用 FTOL 确定标准 整个术语不会产生任何问题 直到z变得非常大 我期望的最大值z大约 220 正如您所看到的 第一项在阶乘 221 附近具有最大值 因此必须在阶乘 500 附近移动 直到达
  • 如何获取 py2exe 中可执行文件的当前目录?

    我在脚本中使用这段代码以跨平台的方式查明它的运行位置 SCRIPT ROOT os path dirname os path realpath file 很简单 然后我继续使用SCRIPT ROOT在我的脚本的其他区域 以确保一切都是正确相
  • 使用合作伙伴级证书将应用程序安装到 Samsung Tizen TV

    我在将开发的应用程序安装到三星电视设备时遇到问题 现在我找到了解决方案 我想分享我的经验 如果您添加合作伙伴级别权限 例如http developer samsung com privilege drminfo http developer
  • 使用ajax将数据从服务器发送到客户端

    我有一个场景 我正在制作一个基于内联网的网络应用程序 供公司内部使用 每当客户端更新应用程序中的任何内容时 其他客户端都应该更新 Steps 一个客户端更新一些任务 然后服务器自动将更新的数据发送给当前连接的客户端 因此 客户端无需向服务器
  • 使用“id”列中的键值从 MySQL 生成 PHP 数组

    我有一个 MySQL 数据库 如下所示 ID TEXT PARENTID 20 Item1 null 23 Item2 20 27 Item3 20 80 Item4 27 我想要的是在数组中检索这些数据 如下所示 Array 20 gt
  • 在 AHK 中如何更快地从屏幕区域获取像素数据?

    我知道对于某些事情 用 C 编写某些事情会更好 但我真的很希望能够在 AHK 中做到这一点 我希望能够从屏幕的 100x300 区域检索像素数据 但是PixelGetColor太慢了 下面的测试表明 每个像素大约需要 0 02 秒 即从整个
  • 如何在html和css中将图像放在圆圈内?

    图像应位于圆圈内 并且圆圈应具有白色背景 图像大小应小于圆圈并位于中心 我试试这个 icon i color fff width 40px height 40px border radius 20px font size 25px text
  • 使用 spring 3 安全性在 jsp 页面中访问我的自定义用户对象

    我已经实施了UserDetailsService 它返回一个实例MyUser 它实现了UserDetails public MyUser loadUserByUsername String arg0 现在我想访问我的自定义 getter 字
  • 在 Windows Phone 7 上使用 Tweetsharp 获取最新推文

    我只想使用 Tweetsharp 获取我的 Windows Phone 应用程序的最新推文 以下是我所做的 使用 Nuget 包管理器安装 Tweetsharp 将我的应用程序注册到 Twitter 开发者网站 获取消费者密钥 消费者秘密
  • .NET 二进制序列化对象并引用其他对象。 。 。会发生什么?

    如果您有一个引用其他对象 例如实例 B 和 C 的对象实例 A 并且您将 A 二进制序列化到文件中 会发生什么情况 您现在有包含 A B 和 C 的序列化数据吗 它到底是如何运作的 如果我反序列化数据会得到什么 甲 乙 丙 也请随意包含内部