有没有办法将类字段标记为仅反序列化而不序列化?

2024-04-01

听起来很奇怪,但这正是我想要的,因为我正在使用名为“Project”的数据结构,该数据结构被序列化为保存文件。我希望能够使用已弃用的字段对旧版本的保存文件进行反序列化,然后仅使用当前使用的字段对其进行重新序列化。问题是我想在重新序列化结构时删除那些已弃用的字段,以最小化文件大小。是否可以将字段标记为“仅可反序列化”?

Edit:

感谢您的想法!我决定主要根据 NickLarsen 的建议进行构建,并创建一个旧版本的项目结构,其中所有已折旧的字段都位于单独的命名空间中。不同的是,我决定在反序列化时执行升级。这很棒,因为我可以在一行中完成所有操作(希望您能了解我在这里所做的要点):

Project myProject = new Project((Depreciated.Project)myFormatter.Deserialize(myStream));

构造函数只是基于旧的臃肿数据结构返回一个新的最小数据结构的新实例。

第二次编辑:

我决定遵循 bebop 的建议,为每个项目版本创建新的类,其中最旧的版本包括所有折旧的和新的字段。然后,每个项目的构造函数都会升级到下一个版本,并在此过程中删除折旧的字段。下面是从版本 1.0.0 -> 1.0.5 -> current 转换的说明性示例。

Project myProject = new Project(new Project105((Project100)myFormatter.Deserialize(myStream)));

实现这一点的一个关键是通过使用序列化绑定器 http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx.


您是否可以在每次结构更改时创建数据结构类的新版本,并让新类的构造函数采用前一个类的实例,并从那里填充自身。要加载最新的类,您尝试从序列化文件创建最早的类,直到成功,然后将其重复传递到链中下一个类的构造函数中,直到获得数据结构的最新版本,然后您可以保存该类。

为每次格式更改创建一个新类可以避免在数据结构更改时更改任何现有代码,并且您的应用程序可能不知道保存文件是旧版本这一事实。它允许您从任何以前的版本加载,而不仅仅是最后一个版本。

这种事情是由一个实现的责任链 http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern可以轻松插入新格式,只需对现有代码进行最少的更改。

虽然不是教科书上的责任链,但您可以通过以下方式实现:

(注意:未经测试的代码)

public interface IProductFactory<T> where T : class
{
    T CreateProduct(string filename);
    T DeserializeInstance(string filename);
}

public abstract  class ProductFactoryBase<T> :  IProductFactory<T> where T : class
{
    public abstract T CreateProduct(string filename);

    public T DeserializeInstance(string filename)
    {
        var myFormatter = new BinaryFormatter();
        using (FileStream stream = File.Open(filename, FileMode.Open))
        {
            return myFormatter.Deserialize(stream) as T;
        }

    }
}

public class ProductV1Factory : ProductFactoryBase<ProductV1>
{
    public override ProductV1 CreateProduct(string filename)
    {
        return DeserializeInstance(filename);
    }
}

public class ProductV2Factory : ProductFactoryBase<ProductV2>
{
    ProductV1Factory successor = new ProductV1Factory();
    public override ProductV2 CreateProduct(string filename)
    {
        var product = DeserializeInstance(filename);
        if (product==null)
        {
            product = new ProductV2(successor.CreateProduct(filename));
        }
        return product;
    }

}

public class ProductV2
{
    public ProductV2(ProductV1 product)
    {
        //construct from V1 information
    }
}


public class ProductV1  
{
}

这样做的优点是,当您想要添加 ProductV3 时,您只需将应用程序中使用的类更改为 ProductV3 类型(无论如何您都需要这样做),然后更改加载代码以使其使用 ProductV3Factory,它与 ProductV2Factory 基本相同,但它使用 ProductV2Factory 作为后继者。您不需要更改任何现有的类。你可能可以稍微重构一下以获得以下共性CreateProduct进入基类,但它传达了这个想法。

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

有没有办法将类字段标记为仅反序列化而不序列化? 的相关文章

  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 重载<<的返回值

    include
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 在运行时检测字节序有什么好处?

    我搜索了宏来确定机器上的字节顺序 但没有找到任何标准的处理器宏 但很多解决方案在运行时执行此操作 为什么我应该在运行时检测字节序 如果我这样做 ifdef LITTLE ENDIAN inline int swap int x do swa
  • Python Atom API:使用字典时如何设置atom var

    The Atom api https pypi python org pypi atom 0 3 6是Enaml用来实现MVC的库 更改一个原子变量 UI 就会更新 在 UI 中更改它 您的模型就会更新 我想将 Atom var 在本例中为
  • 强制“git status”在终端上输出颜色(在脚本内)

    EDIT 我想提出一个建议 解析颜色通常是一个考虑不周的想法 我想要它的部分原因是我可以解析它并在我自己的脚本输出中传递它 这是 好吧 但使用瓷器或类似的东西并自己重新构建彩色部件可能会更明智 原始问题如下 我喜欢看到颜色 因为我的脚本足够
  • 用文字初始化引用成员变量

    在下面的代码中 我使用文字初始化引用变量 class ABC public const int a ABC a 43 void newfoo printf NEWFOO d a int main ABC obj obj newfoo 该程序
  • ASP .NET CORE 2.2 JWT 和声明网站身份验证

    我有一个 net core 2 2 api 它 在成功登录时 生成一个 JWT 令牌 其中包含一个声明身份 该身份传递经过身份验证的用户的用户名 权限和角色等信息 在我的 net core 2 2 中 Web 应用程序我有一个登录机制 可以
  • 如何将 VSCode 工作区设置应用于所有子文件夹?

    我和我的团队正在一个大型仓库中工作 其中有数十个不同的项目 我们有在 VSCode 中编写文档的设置 我们希望将其应用于所有工作区子文件夹 这样 如果您打开您实际正在处理的项目所在的子文件夹 您将获得与打开 VSCode 相同的体验在根工作
  • IO 错误:网络适配器无法与 Oracle 11gR2 建立连接。与 SQL 开发人员联系

    我已按照 中提到的所有步骤 在 RedHat6 Linux 实例上安装了 Oracle 11ghttp technologylair net 2013 08 oracle 11g installation linux comment 50
  • 在 Heroku 上拉入经过身份验证的 git 存储库

    我一直在尝试在 Heroku 上引入一些经过身份验证的 git 存储库 但遇到了一些问题 理想情况下 我希望能够使用令牌解决方案在这里 https github com blog 1270 easier builds and deploym
  • 外部库会使应用程序变慢吗?

    我正在构建一个从网页中抓取信息的应用程序 为此 我选择使用一个名为的 html scraperJsoup http jsoup org 因为它使用起来非常简单 Jsoup 还依赖于 Apache Commons Lang 库 它们总计 38
  • python:如何根据值合并字典列表中的字典

    我有一个字典列表 其中每个字典由 3 个键组成 名称 url 和位置 在整个字典中 只有 name 的值可以相同 并且 url 和 location 在整个列表中始终是不同的值 Example name A1 url B1 location
  • BaseGameActivity.runOnUpdateThread() 与 Entity.registerUpdateHandler()

    如果我执行有什么区别Runnable with runOnUpdateThread 或者我将更新处理程序注册到实体中并用它执行代码 我想删除一个Sprite从场景Sprite detachSelf 在这种情况下 教程说必须在更新线程中调用此
  • 无法从 START_OBJECT 令牌中反序列化 java.lang.String 实例

    我遇到了一个问题 我的可部署 jar 遇到了异常 而当我在 IntelliJ 本地运行此异常时 该异常不会发生 例外 Receiving an event id 2 socket 0c317829 69bf 43d6 b598 7c0c55
  • 为什么 linter 会选择无用的转义字符?

    转义字符串 模板文字和正则表达式中的非特殊字符没有任何效果 Source https eslint org docs rules no useless escape https eslint org docs rules no useles
  • iOS 启动设置 -> 限制 URL 方案

    我最近发现了一个很棒的iOS5自定义设置URL方案 这可以在这个伟大的website http handleopenurl com scheme apple settings app 我发现这很有效 将用户从我的应用程序引导到 设置 应用程
  • 在 UITableViewController 中处理空 UITableView

    我有一个 UITableViewController 其中填充了一些数据 如果数据返回为空 则显然表是空的 使用什么适当的方法来处理这种情况并放置类似 无可用数据 的 UILabel 之类的内容 我一直在使用 NSString tableV
  • 在 PHP 中嵌入 HTML 中实现内联三元运算符

    我是 PHP 的学习者 我有一个正在实现 HTML5 代码的代码 我想做的是将内联三元运算符嵌入到我的占位符中 我已关注此链接 但没有一个有相同的问题陈述 使用三元运算符放置内联样式php https stackoverflow com q
  • 将参数传递给 WebClient.DownloadFileCompleted 事件

    我正在使用WebClient DownloadFileAsync 方法 并想知道如何将参数传递给WebClient DownloadFileCompleted事件 或任何其他与此相关的事件 并在调用的方法中使用它 我的代码 public c
  • 通过 PHP 发出 HTTPS 请求并获取响应

    我想通过 PHP 向服务器发出 HTTPS 请求并获取响应 与此 ruby 代码类似的东西 http Net HTTP new www example com 443 http use ssl true path uri resp data
  • htaccess 防止热链接也可以防止外部链接

    我在 htaccess 文件中添加了这段代码 以防止图像和 pdf 文件的热链接 但它也会阻止正常的外部链接工作 我的 htaccess 文件 RewriteEngine On RewriteCond HTTP REFERER Rewrit
  • 有没有办法将类字段标记为仅反序列化而不序列化?

    听起来很奇怪 但这正是我想要的 因为我正在使用名为 Project 的数据结构 该数据结构被序列化为保存文件 我希望能够使用已弃用的字段对旧版本的保存文件进行反序列化 然后仅使用当前使用的字段对其进行重新序列化 问题是我想在重新序列化结构时