假设您有各种任意类型的对象,您希望将它们存储在键值类型的表中.键可以是例如int,string或guid.价值是什么?字符串,二进制或其他什么? 你将如何存储和加载对象?我会想某种序列化
你将如何存储和加载对象?我会想某种序列化,但是什么样的?
我有一个解决方案,我有一个类有这两种方法:
public T Get<T>(string key) public void Set<T>(string key, T value)
在数据库中,我有一个包含字符串列和二进制列的表.然后我使用BinaryFormatter来序列化和反序列化值,并使用Linq2Sql将二进制结果放入数据库表中.但这是一个很好的解决方案吗?目前我只敢用整数和字符串这样的简单值来尝试这个. BinaryFormatter和序列化一般如何处理更复杂的类型,如结构和类?特别是如果例如值包含数组或列表之类的东西.
有什么指针吗?
目前我将使用它来存储各种最后选择或输入类型的值.虽然它们可能并不总是必须打字.例如,它可能是从列表中选择值.重点是它们几乎只是用户的便利,所以不是非常关键的数据.
如果你可以将自己局限于易于映射到SQL类型的特定类型,我很想将它们保存在表中的单独列中,确保只填充其中一个.这样你就可以获得人类可读的数据了.数据库,使ad-hoc查询更容易.这也意味着你不会永远陷入.NET.有许多不同的序列化选项可供使用.核心框架当然是BinaryFormatter和XmlSerializer; XML更便携,但代价是空间.我相信它也不太完全可定制.
存在第三方序列化技术,例如Thrift和Protocol Buffers.这些技术在它们可以序列化的方面更具限制性,但更便携. (免责声明:我的20%项目是协议缓冲区的C# port,所以我不完全不偏不倚.)
您还应该考虑版本控制 – 如果您更改了序列化/反序列化的数据结构,您希望发生什么?也许你不需要能够阅读“旧”记录,也许你可以.也许您需要旧代码才能读取“新”记录 – 或许不是.
您选择的技术应该真正受到需求的驱动.你尝试制作它越普遍,它就会变得越复杂 – 所以在尝试提出解决方案之前要弄清楚你真正需要的东西.