Xml 如何将对象数据源数据保存到磁盘?
我有一个项目,其中数据来自网络(不是数据库),并且有自己的解析特性 解析过程将数据存储在充满Xml 如何将对象数据源数据保存到磁盘?,xml,vb.net,data-binding,datasource,Xml,Vb.net,Data Binding,Datasource,我有一个项目,其中数据来自网络(不是数据库),并且有自己的解析特性 解析过程将数据存储在充满公共属性的类的对象数组中 该类及其数组用作BindingSource的对象数据源,BindingSource在屏幕上的DataGridView中将值显示为一个漂亮的表 现在,我需要将这些数据保存到磁盘上(并能够在稍后将其检索回来并发送回网络) 我以前曾使用过将数据集保存为XML,实现起来很容易,但这一点让我感到困惑 所有这些信息都已经在代码中了,所以我不认为我应该逐行输入,每个属性都可以保存它。 我一直在
公共属性的类的对象数组中
该类及其数组用作BindingSource的对象数据源,BindingSource在屏幕上的DataGridView中将值显示为一个漂亮的表
现在,我需要将这些数据保存到磁盘上(并能够在稍后将其检索回来并发送回网络)
我以前曾使用过将数据集保存为XML,实现起来很容易,但这一点让我感到困惑
所有这些信息都已经在代码中了,所以我不认为我应该逐行输入,每个属性都可以保存它。
我一直在尝试通过某种方式将数据从绑定器中取出到一个新的数据集,这样我就可以使用XML方法,或者通过某种方式将数据从绑定器中取出到磁盘,甚至直接访问数据源对象,但都没有成功
我真的不在乎它在磁盘中是否可以作为纯文本读取,只要我可以在以后将其读回数据源对象
有没有办法做到这一点?序列化呢
Dim fileStream As Stream = File.Open("somefile.txt", FileMode.Create)
Dim xmlFormatter As New System.Xml.Serialization.XmlSerializer(GetType(YourClass))
xmlFormatter.Serialize(fileStream, anObjectOfYourClass)
fileStream.Close()
要使其工作,必须使用Serializable()
属性对类进行注释。这将存储除具有NonSerialized()
属性之外的任何属性。当然,类中的所有类型都应该是可序列化的
要在以后加载数据,除了使用xmlFormatter.Deserialize()
之外,过程与此类似
另请参见为什么不直接使用保存对象
示例:
Class MyData
Public Property Data1 As String
Public Property Data2 As Int32
Public Property Data3 As String()
End Class
Sub Main
Dim d = New MyData() With { _
.Data1 = "FooBar", _
.Data2 = 1337, _
.Data3 = new String(){"Foo", "Bar"} _
}
Dim serializer = new System.Xml.Serialization.XmlSerializer(gettype(MyData))
'' Saving an object
Using fs = new System.IO.FileStream("c:\users\username\mydata.xml", System.IO.FileMode.Create)
serializer.Serialize(fs, d)
End Using
'' Loading the saved data to a new object
Using fs = new System.IO.FileStream("c:\users\username\mydata.xml", System.IO.FileMode.Open)
Dim new_one = CType(serializer.Deserialize(fs), MyData)
'' Do something
End Using
End Sub
<?xml version="1.0"?>
<MyData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data1>FooBar</Data1>
<Data2>1337</Data2>
<Data3>
<string>Foo</string>
<string>Bar</string>
</Data3>
</MyData>
结果文件内容:
Class MyData
Public Property Data1 As String
Public Property Data2 As Int32
Public Property Data3 As String()
End Class
Sub Main
Dim d = New MyData() With { _
.Data1 = "FooBar", _
.Data2 = 1337, _
.Data3 = new String(){"Foo", "Bar"} _
}
Dim serializer = new System.Xml.Serialization.XmlSerializer(gettype(MyData))
'' Saving an object
Using fs = new System.IO.FileStream("c:\users\username\mydata.xml", System.IO.FileMode.Create)
serializer.Serialize(fs, d)
End Using
'' Loading the saved data to a new object
Using fs = new System.IO.FileStream("c:\users\username\mydata.xml", System.IO.FileMode.Open)
Dim new_one = CType(serializer.Deserialize(fs), MyData)
'' Do something
End Using
End Sub
<?xml version="1.0"?>
<MyData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data1>FooBar</Data1>
<Data2>1337</Data2>
<Data3>
<string>Foo</string>
<string>Bar</string>
</Data3>
</MyData>
福巴
1337
福
酒吧
hi Filburt,我不知道你为什么从标题中删除VB.NET,它不是一个标签,它通过说明我正在编程的平台为问题提供了一个上下文。你和另一个人几乎在同一时刻提出了同样的答案。我不知道这个存在,我现在就试试。你和另一个人几乎在同一时刻提出了同样的答案。我不知道这个存在,我现在就试试。反应很好,很好,很完整。只是一个注释,我不得不使用'Dim serializer=new System.Xml.Serialization.XmlSerializer(gettype(MyData())')`这样序列化程序就可以是一个MyData数组。而且它工作平稳。我将只添加保存对话框和其他详细信息。谢谢@Budius很高兴我能帮忙:-)