什么是替代 BinaryFormatter 的良好内存保护序列化器? [关闭]

2023-12-04

我正在使用 .Net v3.5 和 C# (Visual Studio 2008) 来处理一个大型应用程序,该应用程序使用BinaryFormatter创建数据文件。

Stream stream = File.Open(filePath, FileMode.Create, FileAccess.Write, FileShare.None);
BinaryFormatter formatter = new BinaryFormatter(null, (new StreamingContext(StreamingContextStates.All, false)));
formatter.Serialize(stream, data);
stream.Flush();
stream.Close();

不幸的是,我经常得到OutOfMemoryException从这个实施。我正在寻找某种替代方案BinaryFormatter我可以快速过渡到。

值得注意的是,这个应用程序主要依赖于ISerializable, 而不是[Serializable]保留版本控制(某种)的属性。此外,我们正在序列化的数据有多个指向同一对象的变量。最后,我们还序列化列表和字典,使数据包含相当深的层次结构ISerializables.

因此,我更喜欢一种利用的替代方案ISerializable.GetObjectData能够处理指向同一对象的重复指针。

编辑:在回复 dbc 时,你问了一个非常好的问题。复制问题后,我得到的错误是:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
    at System.Runtime.Serialization.ObjectIDGenerator.Rehash()
    at System.Runtime.Serialization.ObjectIDGenerator.GetId(Object obj, Boolean& firstTime)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.InternalGetId(Object obj, Boolean assignUniqueIdToValueType, Type type, Boolean& isNew)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteKnownValueClass(NameInfo memberNameInfo, NameInfo typeNameInfo, Object data)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteMembers(NameInfo memberNameInfo, NameInfo memberTypeNameInfo, Object memberData, WriteObjectInfo objectInfo, NameInfo typeNameInfo, WriteObjectInfo memberObjectInfo)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteMemberSetup(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo, String memberName, Type memberType, Object memberData, WriteObjectInfo memberObjectInfo)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo, String[] memberNames, Type[] memberTypes, Object[] memberData, WriteObjectInfo[] memberObjectInfos)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
    at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
    at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
    at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)

快速谷歌搜索告诉我,这是由于序列化了一个太大的对象。我很确定我没有存储任何二进制信息,如图像或音频,所以这让我觉得有点奇怪。我的猜测是,列表可能太大而无法序列化。

顺便说一句,我使用相同的过程尝试了下面的代码,并且它们没有产生异常。

SerializationInfo info = new SerializationInfo(typeof(Data), new FormatterConverter());
StreamingContext context = new StreamingContext(StreamingContextStates.All, false);
data.GetObjectData(info, context);
foreach (SerializationEntry e in info)
{
    Debug.WriteLine("Name: " + e.Name);
    Debug.WriteLine("Type: " + e.ObjectType.ToString());
    Debug.WriteLine("Value: " + e.Value.ToString());
}

不会抛出该特定异常,因为您正在序列化太大的对象。它被抛出是因为你正在序列化一个包含太多对象的对象图,以至于ObjectIDGenerator inside BinaryFormatter无法分配足够大的哈希表来为每个指针分配唯一的 ID。序列化器使用ObjectIDGenerator为序列化的每个引用类生成运行时唯一 ID,以便正确序列化对同一类实例的多个引用作为单个基于 id 的间接引用。您选择的任何图形序列化器都需要执行类似的操作。

您是否可以减少同时序列化的类实例的数量,而不是采用新的图形序列化器技术(这将是相当繁重的)?例如,您可以将对象图分成不连续的段,并将每个段按顺序序列化到流中吗? (有关如何执行此操作的教程如下:将许多不同的对象序列化到一个文件中.) 或者您是否有一些类包含多个小叶类,这些叶类从不共享,并且可以用所有这些叶类的单个代理替换?

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

什么是替代 BinaryFormatter 的良好内存保护序列化器? [关闭] 的相关文章

随机推荐

  • 如何清除 C# 中的事件订阅?

    学习以下 C 类 c1 event EventHandler someEvent 如果有很多订阅c1 s someEvent事件 我想清除所有这些 实现此目的的最佳方法是什么 还要考虑到此事件的订阅可以是 lambdas 匿名委托 目前我的
  • 如何解决“paramiko.ssh_exception.SSHException:无法从 ssh-agent 获取密钥”

    我正在尝试使用 Paramiko Python 模块通过 SSH 连接到远程服务器 在 CentOS 7 服务器上使用 Python 版本 3 6 7 安装 但出现以下错误 python import paramiko gt gt gt s
  • 康威生命游戏 C++ 的包装

    我正在尝试编写一个程序 在 20x60 单元板上实现康威的生命游戏 网格将环绕 因此左侧将连接到 相邻 右侧 顶部将连接到底部 因此任何具有位置的单元格 1 col 将有一个邻居 maxRow col 任何有位置的单元格 row 1 将有一
  • 调用绘图实际上并不产生绘图

    请参阅下面的循环 它调用绘图 k k 1 2 次 但实际上没有生成任何绘图 但是 如果我更改代码以手动调用绘图 例如 plot my tree c 1 2 生成了图 my tree 是一个 GBM 对象 请参阅下面的完整代码 there i
  • asp.net core控制器方法返回结果后如何继续处理?

    我有一些流程需要很长的处理时间 客户不需要立即响应 我尝试过下面的代码但没有成功 HttpPost Route run public async Task Run this LongProcess ConfigureAwait false
  • VBA:创建类模块数组

    我正在尝试创建自定义类的数组 但它给了我这个错误 运行时错误 91 未设置对象变量或 With 块变量 到目前为止 这是我的代码 Sub DBM Format Dim coreWS As Worksheet Dim WS As Worksh
  • 如何使用 Rapidminer 在测试集上进行测试?

    我正在使用 Rapidminer 进行分析 我在几个模型上使用了交叉验证来获得最佳的工作模型 现在我想使用这个模型在我使用分割数据制作的单独测试集上进行测试以估计性能 我如何使用测试集 据我所知 所有验证模块都使用模型所在的训练集 我可以使
  • 如何将日期拆分为月

    使用 SQL Server 2000 我想保存月份的详细信息 用户录入 ID 001 Fromdate 01 01 2012 Todate 29 03 2012 ID 002 Fromdate 01 05 2012 Todate 19 06
  • c函数返回静态变量

    我有一个关于 C 函数如何返回静态变量的问题 in data h file include
  • AtomicInteger 类中 addAndGet 的实现

    我正在浏览 Java Java 6 源代码addAndGet方法中的AtomicInteger class 对应的代码如下 public final int addAndGet int delta for int current get i
  • Cmd - 获取变量名中的变量

    我有一个问题variable in variable 代码如下 set a 1 set b a echo b 预期结果是 1 As a被分配给变量b and 1被分配给变量a 另外 还有一种情况 set b a set a1 100 set
  • 地区/次地方:列表或如何使用 Google API

    我正在拼命寻找世界上所有城市的地区或次地区的列表 数据库 我使用 maxmind com 上的世界所有城市的列表 但是 他们不提供次区域或地区 例如纽约的 曼哈顿 布鲁克林 等 有谁知道某处是否存在解决方案 或者是否有可能使用 Google
  • 如何动态创建菜单项?

    我正在构建一个Android应用程序 我正在尝试构建一个用户管理系统 用户可以在其中登录 注销等 我想在用户注销时显示登录菜单项 在用户登录时显示注销按钮我怎样才能动态地做到这一点 这是现在的布局文件 menu menu
  • Android 谷歌地图 LocationClient

    我在 Android 应用程序中使用 Google Maps Android API v2 LocationClient http developer android com reference com google android gms
  • 如何使用golang的模板实现级联下拉菜单

    设想 我有一个级联场景 其中第二个下拉列表中的值取决于第一个 我有三个模板 布局 输入 和 内部 Attempt 我正在对 输入 模板中第一个下拉列表的更改进行ajax调用 并坚持处理返回的响应 目前我找到了一种通过替换第二个下拉列表的 h
  • 如何获取 JavaScript 中所有可能的字符?

    假设 JavaScript 中的所有字符都是a b c d e and f 我想做的是在字符之间创建随机映射 所以上面的内容可能是这样的 a e b b c e d b e a f c 首先 如何获取 JavaScript 中所有可能的字符
  • ios 8 交互式通知不显示操作

    这是我为 ios8 注册交互式通知的代码 void registerInteractiveNotifications UIMutableUserNotificationCategory corideInviteCategory self c
  • 不可变对象和延迟初始化。

    http www javapractices com topic TopicAction do Id 29 上面是我正在看的文章 不可变对象极大地简化了您的程序 因为它们 允许 hashCode 使用延迟初始化 并缓存其返回值 谁能帮我解释
  • 具有架构优化的 Docker 镜像?

    一些库 例如 BLAS LAPACK 或某些优化库 会在编译时针对本地计算机架构进行优化 让我们以 OpenBlas 为例 使用 OpenBlas 创建 Docker 容器有两种方法 使用 Dockerfile 在其中指定 OpenBlas
  • 什么是替代 BinaryFormatter 的良好内存保护序列化器? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在使用 Net v3 5 和 C Visual Studio 2008 来处理一个大型应用程序 该应用程序使用BinaryFormatter创建数据文件 Stream stream F