gpt4 book ai didi

c# - 序列化/反序列化和非默认构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:02 30 4
gpt4 key购买 nike

考虑这个类:

[Persistable]
public sealed class FileMoveTask : TaskBase
{
[PersistMember]
public string SourceFilePath { get; private set;}

[PersistMember]
public string DestFilePath { get; private set;}

public FileMoveTask(string srcpath, string dstpath)
{
this.SourceFilePath = srcpath;
this.DestFilePath = dstpath;

//possibly other IMPORTANT initializations
}

//code
}

我可以通过序列化具有属性 PersistMember 的所有成员来持久化此类的对象。但是我在反序列化过程中遇到了一些问题(设计问题)。特别是,问题出在构造函数中可能存在的“可能是其他重要的初始化”,程序员可能会决定让少数成员持久化(即不添加 PersistMember 到他们)可能是因为那没有意义。

在这种情况下,我如何将对象反序列化到与它原来完全相同的状态?我想,这个问题归结为:我如何调用非默认构造函数,将相同参数传递给它,这是之前传递的?有什么办法吗?我们可以制定一些可以由编译器强制执行的规则(某种元编程)吗?构造函数属性可以提供帮助吗?

最佳答案

解决此问题的最简单方法是使用现有的众所周知的技术。例如,看看 .NET Framework 中使用的其他序列化机制(您会注意到巨大的多样性)。

例如,在 BinaryFormatter 中, SoapFormatterDataContractSerializer使用以下技术反序列化对象:

  1. 通过调用 FormatterServices.GetUnitializedObject 获取“原始”对象
  2. 对构造的对象调用单独的预序列化方法(通过检查标记为 OnSerializingAttribute 的方法)。
  3. 反序列化对象的状态(通过检查适当的属性以了解序列化程序应跳过哪些字段以及应反序列化哪些字段)。
  4. 在反序列化对象上调用后序列化方法(通过检查标有 OnSerializedAttribute 的方法)。

另一方面XmlSerializer使用完全不同的算法:它需要无参数构造函数,应该用作“序列化前”和“序列化后”步骤。

所以我的观点是它完全取决于序列化程序的类型及其实现。并且仍然需要序列化程序的作者和序列化程序的消费者的一些精神努力。

所以我强烈建议使用现有技术之一,但不要发明轮子(比如添加一些其他自定义属性来恢复对象的状态)。您甚至可以使用现有属性来简化从 .NET 序列化工具到自定义序列化机制的迁移(以及使用其他属性,如 NonSerializableAttrubite )。

关于c# - 序列化/反序列化和非默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13562277/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com