我在上一个项目中尝试了SOLID体系结构。
我有一个名为ILog
的接口和一个实现了Log
的类ILog
。 (据我了解,应该遵循开放式/封闭式原则)
为了开放扩展,我通过List<ILog>
实现了前端,而不是通过坚定的实现List<Log>
实现了
对List<ILog>
进行序列化是没有问题的,但是对序列化则是没有问题的。我当然知道为什么,因为解串器不知道应该使用哪个实现类。
问题: 如何知道将通过接口引用序列化的对象反序列化为哪种具体类型?
答案 0 :(得分:1)
对列表进行序列化是没有问题的,但是对序列化进行反序列化。
如果要反序列化,则必须以某种方式与串行器进行通信,这将串行化要使用的接口表示形式。如果是Json.NET,则可以将JsonConstructorAttribute(另请参阅this answer)或resolvers与依赖项注入结合使用。
问题:如果我仍然必须为数据存储/数据导入定义特定的实现类,那么与List一起工作对我有什么帮助?
接口使您的代码与实际实现脱钩,从而带来各种好处。例如,就单元测试而言,它们使模拟更加容易(因为您可以通过模拟实例满足接口,而不必被迫使用“真实”类)。此外,接口还使您可以受益于covariance/contravariance,而C#中的类则没有。要进一步了解接口的好处,请查看this问题的各种答案,或查看this博客文章。
如上所述,接口总是会引入一定程度的开销/抽象,您需要根据情况/情况进行评估,无论它们是否有意义。
处理接口对象的数据存储的最佳方法是什么?或者仅在运行时使用它们?
您必然需要存储具体的表示形式,这意味着在持久化时,您需要确定要用于存储(以及随后的反序列化)的具体实现。