.net 序列化:如何有选择地忽略数据字段

2024-01-09

在。 Net你可以将一个字段标记为不可序列化,并且在序列化过程中它将被跳过。

我正在寻找一种简单的方法,它允许我在运行时控制是否应序列化特定字段。


您指的是“将字段标记为不可序列化”,所以我假设您正在使用BinaryFormatter and [NonSerialized]。如果是这样,唯一的办法就是有条件的序列化是通过实现ISerializable并添加一个类似的构造函数,并将逻辑放在GetObjectData执行。但这是乏味且容易出错的。我建议查看 protobuf-net,它具有更简单的条件序列化,使用使用的标准模式TypeDescriptor and XmlSerializer,但仍然是二进制输出(比BinaryFormatter, 实际上)。具体来说:

[ProtoContract]
public class SomeType {
    [ProtoMember(1)]
    public string Name {get;set;}

    private bool ShouldSerializeName() {
       // return true to serialize Name, false otherwise
    }
}

This ShouldSerialize*是一个标准的基于名称的约定 - 没有特定于此序列化器的内容。

这是相同的通过ISerializable:

[Serializable]
public class SomeType : ISerializable
{
    public SomeType() { }
    public string Name { get; set; }


    void ISerializable.GetObjectData(
             SerializationInfo info, StreamingContext context)
    {
        if (/* should serialize Name */) info.AddValue("Name", Name);
        //... all other fields
    }
    protected SomeType(SerializationInfo info, StreamingContext context)
    {
        foreach (SerializationEntry entry in info)
        {
            switch (entry.Name)
            {
                case "Name": Name = (string)entry.Value; break;
                //... all other fields
            }
        }
    }
}

还有很多需要维护;特别是,您在使用时必须对所有会员负责ISerializable- 但是,如果您只使用 protobuf-net,您可以根据具体情况进行处理。

实际上,您也可以混合搭配,即如果您坚持使用BinaryFormatter,您仍然可以将工作卸载到 protobuf-net,但是它会改变格式(所以不会与旧数据兼容)。例如:

[Serializable, ProtoContract]
public class SomeType : ISerializable
{
    public SomeType() { }
    [ProtoMember(1)]
    public string Name { get; set; }
    private bool ShouldSerializeName() { /* condition */ }

    void ISerializable.GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
        Serializer.Serialize(info, this); 
    }
    protected SomeType(SerializationInfo info, StreamingContext context)
    {
        Serializer.Merge(info, this);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net 序列化:如何有选择地忽略数据字段 的相关文章

  • .NET 中非常奇怪的 SSL 错误:仅针对特定 URL 无法解密指定数据

    我正在使用 NET 从 URL 下载数据 对于大多数 URL 它都没有问题 但对于一个特定的 URL 当我尝试建立连接时 我收到一个非常奇怪的错误 此外 该错误仅在第二次 及后续 尝试发出请求时发生 第一次似乎总是有效 这是一些演示该问题的
  • 使用另一个 MEF 程序集中的类而不引用它

    我有 2 个 MEF 组件 设其为A成分和B成分 我需要的是能够从组件 A 中的组件 B 访问一个类 而不需要引用它 然后我想手动实例化该类的对象 目前我看到 MEF 允许使用 Import 自动实例化对象 它使用需要引用的接口 我可以使用
  • Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

    以下项目有不同的目标 但我很有趣知道它们如何 暂停 问题 Thread sleep 它会影响系统性能吗 它是否会占用线程的等待时间 关于什么Monitor Wait 他们 等待 的方式有何不同 他们的等待会占用一个线程吗 关于什么Regis
  • ODP.Net - OracleDataReader.读取速度非常慢

    我在 ODP Net 中的 OracleDataReader 方面遇到很多麻烦 基本上 我有一个参数化查询 需要 1 5 秒的时间来运行 返回大约 450 条记录 然后需要 60 90 秒的时间来循环 甚至没有代码在循环中运行 实际上是迭代
  • 将 MVC 操作结果发送到打印机

    我有一个带有操作的控制器 SomeController ActionToBePrinted ActionToBePrinted 返回一个 html 视图 当按下按钮时 从普通的 mvc razor 视图调用此操作 当按下按钮时 我将如何将视
  • 从网络共享运行 .NET 4.0 应用程序时出现异常

    我有一个 NET 4 0 C 控制台应用程序 该应用程序被部署到网络文件共享 我相信是 Windows 2000 Server 文件服务器 如下所示 server share Apps Beta Group JobName JobName
  • .NET 中应用程序域的常见用途和最佳实践?

    关于何时在应用程序中创建新的应用程序域 有哪些准则和最佳实践 另外 有哪些常见用途以及如何在应用程序中使用多个应用程序域的示例 我见过的最常见的场景是能够通过与主程序不同的安全模型提供可扩展性 在单独的 AppDomain 中加载插件可以实
  • 如何向 UWP 项目添加 .NET dll 引用?

    我有几个适用于 NETv4 x 的 NET dll 项目 我将版本更改为 4 6 1 并重新构建 没有出现问题 当我尝试从 UWP 项目向它们添加引用时 出现错误 项目的目标是 NETCore 而文件引用的目标是 NET框架 这不是受支持的
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 是检测异常并抛出它们还是让运行时抛出它们更好?

    假设有这样的设置 public class MyClass public void DoSomething string Data if String IsNullOrWhiteSpace Data throw new NullRefere
  • [程序名称].exe已停止工作

    我有一个基于 Framework 2 0 构建的 NET 应用程序 我已经为它构建了一个安装程序 并尝试在具有 3 5 的计算机上运行它 所有相关环境均在Windows 7上 该应用程序在我的开发机器上以 VS 调试模式完美运行 该机器也具
  • ListView onScroll 事件

    我正在编写一个简单的 C 应用程序 我需要 Listview 上的 onScroll 事件 所以我创建了ListviewEx类继承原来的ListView 我找到了如何从 WinAPI 检测滚动消息 并修改了 WndProc 方法 现在我有这
  • 缺少嵌入互操作类型属性

    在一个 C 项目中 我收到以下警告 警告 CS1762 创建了对嵌入式互操作程序集 Interop SomeLibrary dll 的引用 因为间接引用了程序集 ALibraryOfMine dll 创建的该程序集 考虑更改任一程序集的 嵌
  • 将“String”转换为 c# .net 中 MD5“String”的 Base64 编码

    如何将我的密码 字符串 转换为 MD5 字符串 的 Base64 编码 就像这个字符串 password to X03MO1qnZdYdgyfeuILPmQ 请在这里帮助我 或者只是让我知道如何转换这个技术 password to X03M
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 调整屏幕和字体设置的 WPF 应用程序(或者,我如何将 DLU 与 WPF 中的单元相关联?)

    在MFC中 对话框的设计使用DLUs http msdn microsoft com en us library bb847924 aspx 在 WPF 中 我们以 1 96 英寸为单位指定 虽然这确实会缩放窗口和视觉元素 但我们如何使 W
  • 如何对使用 Controller.User 变量的控制器操作进行单元测试?

    我有一个控制器操作 如果用户已经登录 它会自动重定向到新页面 User Identity IsAuthenticated 针对这种情况编写单元测试以确保重定向发生的最佳方法是什么 我一直在使用以下 Mocks 和 Moq 来允许在我的单元测
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work

随机推荐

  • 与 Ionic Framework 一起使用时,字符集 UTF 8 不起作用

    在我的网络应用程序上 我有像 这样的字符 并且我有元标记但这些字符不会显示在浏览器中 它们显示为问号 我正在使用 Ionic 框架 我缺少什么 用VS打开文件并更改保存选项File gt Advanced Save Options gt U
  • 如何覆盖打字稿中的属性?

    由于当前的语言限制 这可能是不可能的 但我正在使用最新的 TS 1 8 10 并且遇到了 ui grid 打字问题 这isRowSelectable属性于IGridOptions被定义为可选布尔值 但文档说它是一个函数 确实如此 我试图将布
  • Typescript 交换数组项目

    如何使用交换两个元素打字稿 elements elements elements push item1 elements push item2 elements push item3 elements push item4 elements
  • 将浮动子 DIV 置于具有流体宽度的父 DIV 中

    我有以下 HTML div div class child Box1 div div class child Box2 div div class child Box3 div div class child Box4 div div cl
  • Chrome 扩展程序可以在 Chrome 错误页面上运行代码吗? (即 ERR_INTERNET_DISCONNECTED)

    我正在尝试创建一个 chrome 扩展 在运行恐龙迷你游戏的 chrome 错误页面上运行一些 javascript 代码 尝试在选项卡上运行executeScript 时出现权限错误 这是我的代码 清单 js manifest versi
  • 复制 JSESSIONID cookie 时防止复制会话

    背景 我在 tomcat 上部署了一个 javaee web 应用程序 它使用基于表单的身份验证 当 Web 服务器收到登录请求时 它会将请求发送到验证用户登录 用户 ID 和密码 的专用身份验证服务 身份验证成功后 用户会话将保留在 We
  • Angular 5 路由 - 空路径不匹配

    我很困惑这个路由有什么问题 应用程序模块路由 path path1 canActivate Path1Guard loadChildren path1 path1 module Path1Module 路径1 路由 模块 const pat
  • 网站的 HttpContext.Current.Request.ApplicationPath

    我们在虚拟目录下部署了一个 Web 应用程序 现在我们想将其移至其自己的网站进行 SSL 配置 然而 有很多HttpContext Current Request ApplicationPath因此 应用程序无法按预期运行 谁能帮我看看有什
  • 这些 javascript include 定义有区别吗

    两者都包含相同的文件 两者都有效 但是其中一种比另一种有什么优势吗 Scripts jquery validate unobtrusive min js gt 在第一种情况下 Url Content 将相对路径转换为应用程序绝对路径 在第二
  • CursorIndexOutOfBoundException:请求索引 1,大小为 1

    又是我 遇到了 Android 版 sqlite 的问题 我目前得到一个 CursorIndexOutOfBoundsException 请求索引 1 尺寸为 1 但是 我遇到了索引 1 的异常 然后插入了一个cursor moveToFi
  • 基于 SVN 中的预提交构建

    我知道已经有人问过这个问题 但我们真的很想拒绝任何提交文件的尝试 这会破坏主干中的项目 拒绝已提交文件的决定基于所提交文件所属项目的构建过程的结果 我知道在预提交阶段 存储库无法同时访问 但这对我们来说不是问题 因为我们的构建速度非常快 并
  • 如何在 Angular 2 Typescript 中复制到剪贴板?

    有没有办法在 Angular2 Typescript 框架中复制剪贴板 多浏览器 中的文本 我只找到使用 Javascript 的来源 例如 document execCommand copy 您可以围绕以下内容实现 Angular2 指令
  • MIPS 上适用于 Android 的免费 Pascal

    尝试将 Delphi 库移植到 Android Free Pascal 支持 Android ARM 可以使用适用于 Windows 的预构建编译器 不过 Android NDK 现在也支持 MIPS 和 x86 FPC 人员的支持状况如何
  • Pandas 插值给出奇怪的结果

    我正在使用 Pandas 及时插值数据点 但是在重采样和插值时 使用不同的重采样率时 相同的插值时间会得到不同的结果 这是一个测试示例 import pandas as pd import datetime data pd DataFram
  • 将 15 添加到 R 中列的每个数字[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我是 R 新手 我正在尝试为特定列的数据集中的每个数字添加 15 并且想知道这是如何实现的 任何帮助将不胜感激 谢谢 假设你有一个 data
  • 如何禁用 DataGridView CheckBox 列中的特定复选框单元格

    我有一个带有 DataGridView 控件的 winForm 它包含 5 列 其中一列是 CheckBox 列 我想根据同一行另一列中存在的值启用 禁用该列的复选框单元格 我可以使用禁用整个列 但它使整个列处于禁用状态 这是 DataGr
  • 在 .js 文件中声明全局变量是不好的做法吗?

    我有一个 js 文件 我正在其中初始化两个使用的参数 在一个单独的函数中 var submyvar1 var submyvar2 function init myvar1 myvar2 submyvar1 myvar1 submyvar2
  • 这种与 splat 运算符的并行赋值在 Ruby 中是如何工作的?

    letters a b c d e first second letters first gt a second gt b c d e 我明白这会产生什么 但无法理解这一点 这基本上是 Ruby 的魔法吗 无法想到任何其他编程语言可以支持使
  • ng-cloak 和 ng-show 在屏幕上闪烁隐藏元素

    我有一个 div 元素 我只想在项目列表为空时显示该元素 所以我输入以下内容 在 haml 中 no items ng cloak ng show gt items length lt 0 ng cloak gt true 然而 即使我完成
  • .net 序列化:如何有选择地忽略数据字段

    在 Net你可以将一个字段标记为不可序列化 并且在序列化过程中它将被跳过 我正在寻找一种简单的方法 它允许我在运行时控制是否应序列化特定字段 您指的是 将字段标记为不可序列化 所以我假设您正在使用BinaryFormatter and No