我如何才能将 vb.net 用户定义的对象存储在 sql 数据库中。我并不是想用列复制属性。我的意思是将对象转换或编码为字节数组,然后将其存储在数据库中的字段中。就像您在会话中存储对象的实例一样,但我需要该信息在当前会话之后持续存在。


@猎户座爱德华兹

这不是立场问题。这是因为有一天,你会更改你的代码。然后你将尝试反序列化旧对象,你的程序将会崩溃。

我的程序不会“崩溃”,它会抛出异常。对我来说幸运的是,.net有一整套专门针对这种场合的课程。届时我将刷新陈旧数据并将其放回到数据库中。这就是这一领域的要点(或立场,视情况而定)。

有帮助吗?

解决方案

您可以使用 序列化 - 它允许您至少以 3 种形式存储您的对象:二进制(适用于 BLOB)、XML(利用 MSSQL 的 XML 数据类型)或纯文本(存储在 varchar 或 text 列中)

其他提示

在你走上这条路走向你自己最终的疯狂之前,你应该看看这个(或者有一天重复它):

http://thedailywtf.com/Articles/The-Mythical-Business-Layer.aspx

将对象保留在数据库中并不是一个好主意。它扼杀了数据库设计的所有好处。

你可以使用 二进制格式化程序 类将对象序列化为二进制格式,然后将生成的字符串保存在数据库中。

.net 3.x 中的 XmlSerializer 或 DataContractSerializer 将为您完成这项工作。

@aku、lomaxx 和 bdukes - 你们的解决方案正是我正在寻找的。

@1800 信息 - 虽然我很欣赏你对此事的立场,但这是我从每月仅刷新一次的网络服务获得的数据的一个特殊情况。我不需要以数据库形式保存数据,因为这就是网络服务的用途。下面是我终于开始工作的代码。

连载

    #'res is my object to serialize
    Dim xml_serializer As System.Xml.Serialization.XmlSerializer
    Dim string_writer As New System.IO.StringWriter()
    xml_serializer = New System.Xml.Serialization.XmlSerializer(res.GetType)
    xml_serializer.Serialize(string_writer, res)

反序列化

    #'string_writer and xml_serializer from above
    Dim serialization As String = string_writer.ToString
    Dim string_reader As System.IO.StringReader
    string_reader = New System.IO.StringReader(serialization)
    Dim res2 As testsedie.EligibilityResponse
    res2 = xml_serializer.Deserialize(string_reader)

您想要做的就是“序列化”您的对象,.Net 有几种不同的方法来实现它。一种是 System.Xml.Serialization 命名空间中的 XmlSerializer 类。

另一个位于 System.Runtime.Serialization 命名空间中。它支持 SOAP 格式化程序、二进制格式化程序以及您可以继承的基类,所有这些都实现了通用接口。

对于您所讨论的内容,前面建议的 BinaryFormatter 可能具有最佳性能。

我支持@1800 关于这一点的信息。
序列化对象以进行长期存储从来都不是一个好主意

虽然我很欣赏您在此事上的立场,但这是我从每月仅刷新一次的网络服务获得的数据的一个特例。

这不是立场问题。这是因为有一天,你会更改你的代码。然后你将尝试反序列化旧对象,你的程序将会崩溃。

如果它崩溃(或抛出异常),您剩下的只是一堆二进制数据来尝试筛选以重新创建对象。

如果您只保留二进制文件,为什么不直接保存到磁盘。您可能还想考虑使用 xml 之类的东西,正如前面提到的,如果您更改对象定义,您可能无法在不进行一些努力的情况下对其进行反序列化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top