如何在sql数据库中存储vb.net用户定义对象。我不是试图用列复制属性。我的意思是将我的对象转换或编码为字节数组,然后将其存储在数据库中的字段中。就像在会话中存储对象的实例一样,但是我需要将信息保持在当前会话之后。
@Orion Edwards
这不是立场问题。这是因为有一天,你会改变你的代码。然后,您将尝试反序列化旧对象,并且您的程序将崩溃。
我的程序不会“崩溃”,它会抛出异常。幸运的是.net有一整套专门用于此类场合的课程。那时我将刷新陈旧数据并将其放回数据库中。这就是这一领域(或者是立场,视情况而定)的重点。
答案 0 :(得分:5)
您可以使用serialization - 它允许您至少以3种形式存储对象:二进制(适用于BLOB),XML(利用MSSQL的XML数据类型)或纯文本(存储在varchar中)或文本栏)
答案 1 :(得分:3)
在你走向自己最终疯狂的道路之前,你应该看看这个(或者有一天重复它):
http://thedailywtf.com/Articles/The-Mythical-Business-Layer.aspx
在数据库中保留对象不是一个好主意。它杀死了数据库旨在做的所有好事。
答案 2 :(得分:2)
您可以使用BinaryFormatter类将对象序列化为二进制格式,然后将结果字符串保存在数据库中。
答案 3 :(得分:1)
.net 3.x中的XmlSerializer或DataContractSerializer将为您完成这项工作。
答案 4 :(得分:0)
@aku,lomaxx和bdukes - 您的解决方案正是我所寻求的。
@ 1800信息 - 虽然我很欣赏你对此事的立场,但这是我从网络服务获得的数据的一个特殊情况,每月只刷新一次。我不需要以db形式保存的数据,因为这就是webservice的用途。下面是我最终开始工作的代码。
序列化
#'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)
答案 5 :(得分:0)
你想做的事情被称为“序列化”你的对象,.Net有几种不同的方法可以解决它。一个是System.Xml.Serialization命名空间中的XmlSerializer类。
另一个是在System.Runtime.Serialization命名空间中。这支持SOAP格式化程序,二进制格式化程序和可以继承的基类,它们都实现了一个通用接口。
对于你所说的,之前建议的BinaryFormatter可能会有最好的表现。
答案 6 :(得分:0)
我支持@ 1800关于这个的信息 序列化对象以进行长期存储绝不是一个好主意
虽然我很欣赏你对此事的立场,但这是一个特殊的数据案例,我从一个只能每月刷新一次的网络服务中获得。
这不是立场问题。这是因为有一天,你会改变你的代码。然后,您将尝试反序列化旧对象,并且您的程序将崩溃。
答案 7 :(得分:0)
如果崩溃(或抛出异常),剩下的就是一堆二进制数据,试图通过重新筛选来重新创建对象。
如果你只是持久二进制,为什么不直接保存到磁盘。你也可能想看看像xml这样的东西,如上所述,如果你改变你的对象定义,你可能无法在没有一些努力工作的情况下取消序列化。