【问题标题】:vb.net object persisted in databasevb.net 对象持久保存在数据库中
【发布时间】:2010-09-07 15:21:56
【问题描述】:
如何将 vb.net 用户定义的对象存储在 sql 数据库中。我不是想用列复制属性。我的意思是将我的对象转换或编码为字节数组,然后将其存储在数据库中的一个字段中。就像您在会话中存储对象的实例一样,但我需要信息在当前会话之后持续存在。
@Orion Edwards
这不是立场问题。这是因为有一天,你会改变你的代码。然后您将尝试反序列化旧对象,您的程序将崩溃。
我的程序不会“崩溃”,它会抛出异常。幸运的是,.net 有一整套专门用于这种场合的课程。届时我将刷新我的陈旧数据并将其放回数据库中。这就是这一领域的重点(或立场,视情况而定)。
【问题讨论】:
标签:
sql
vb.net
serialization
【解决方案1】:
如果它崩溃(或抛出异常),你只剩下一堆二进制数据来尝试筛选以重新创建你的对象。
如果您只保留二进制文件,为什么不直接保存到磁盘。您可能还想考虑使用 xml 之类的东西,正如已经提到的,如果您更改对象定义,您可能无法在不付出努力的情况下对其进行反序列化。
【解决方案2】:
我支持@1800 关于这个的信息。
为长期存储而序列化对象从来都不是一个好主意
虽然我很欣赏你对此事的立场,但这是我从网络服务中获得的数据的一个特例,该网络服务大约每月刷新一次。
这不是立场问题。这是因为有一天,你会改变你的代码。然后您将尝试反序列化旧对象,您的程序将崩溃。
【解决方案3】:
您想要做的是“序列化”您的对象,而 .Net 有几种不同的方法来处理它。一种是 System.Xml.Serialization 命名空间中的 XmlSerializer 类。
另一个在 System.Runtime.Serialization 命名空间中。它支持 SOAP 格式化程序、二进制格式化程序和您可以从它们继承的基类,它们都实现了一个通用接口。
对于您所说的,之前建议的 BinaryFormatter 可能具有最佳性能。
【解决方案4】:
@aku、lomaxx 和 bdukes - 您的解决方案正是我所寻找的。
@1800 信息 - 虽然我很欣赏你对此事的立场,但这是我从网络服务中获得的数据的一个特例,它每月仅刷新一次。我不需要以 db 形式保存的数据,因为这就是 web 服务的用途。下面是我终于开始工作的代码。
序列化
#'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)
【解决方案6】:
.net 3.x 中的 XmlSerializer 或 DataContractSerializer 将为您完成这项工作。
【解决方案7】:
您可以使用serialization - 它允许您至少以 3 种形式存储对象:二进制(适用于 BLOB)、XML(利用 MSSQL 的 XML 数据类型)或纯文本(以 varchar 或文本存储列)