如何解决是否有XML或JSON序列化程序可以知道使用哪个构造方法来填充不可变对象并序列化IEnumerable <>属性?
假设我有这个不变的结构:
public struct LogGroup
{
public Log<LowResolutionLogData> LowResolutionLog { get; }
public IEnumerable<Log<MediumResolutionLogData>> MediumResolutionLogs { get; }
public IEnumerable<Log<HighResolutionLogData>> HighResolutionLogs { get; }
public LogGroup
(
Log<LowResolutionLogData> lowResolutionLog,IEnumerable<Log<MediumResolutionLogData>> mediumResolutionLogs,IEnumerable<Log<HighResolutionLogData>> highResolutionLogs
)
{
LowResolutionLog = lowResolutionLog;
MediumResolutionLogs = mediumResolutionLogs;
HighResolutionLogs = highResolutionLogs;
}
}
如何在不必使IEnumerable<>
属性成为某种具体类型(例如数组或列表)的情况下进行序列化?
我如何反序列化它而不必使所有属性都可设置(我希望它调用我创建的赋值构造函数)?
对象上的复杂类型也可能具有其自己的复杂类型和IEnumerable<>
作为不可变属性。 Log<>
是一个class
,而它所使用的类型都是structs
,因此使用赋值构造函数进行反序列化需要对两者都起作用。这些类型之一具有大量属性,因此我想避免使用样板代码,并在可能的情况下动态处理序列化/反序列化。
解决方法
非常感谢JSteward在此方面为我指明了正确的方向。我所需要做的就是序列化我的LogGroup
并将其写入文件。
using (var streamWriter = File.CreateText(filePath))
new JsonSerializer().Serialize(streamWriter,myLogGroup);
并将其从文件中读取,然后将其转换回LogGroup
:
using (var streamReader = File.OpenText(filePath))
var myLogGroup = (LogGroup)new JsonSerializer().Deserialize(streamReader,typeof(LogGroup));
我还必须用[JsonConstructor]
标记每个结构的赋值构造函数,以便Deserialize
使用它(否则属性将接收其默认值)。
处理所有类型抽象以进行序列化。
作为旁注,我使用了一个.tt设计时模板来创建我的每个对象,以减少拥有赋值构造函数的维护开销(我从一个源生成属性,构造函数参数和属性赋值)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。