Xml 将DataTable保存到列类型为列表的文件(KeyValuePair…)

Xml 将DataTable保存到列类型为列表的文件(KeyValuePair…),xml,vb.net,datatable,save,keyvaluepair,Xml,Vb.net,Datatable,Save,Keyvaluepair,我正在为一家餐厅建立一个SMS订购服务,但在准确地将数据表保存到文件中时遇到了困难,该文件将在程序重新启动时加载 我的表包含一个名为“MessageHistory”的列,该列的列表类型(KeyValuePair)保存为空 我的桌子看起来像: Clients.Columns.AddRange(新数据列(){ 新数据列(“CodedPhoneNumber”,GetType(String)), 新数据列(“FriendlyPhoneNumber”,GetType(String)), 新数据列(“名称”

我正在为一家餐厅建立一个SMS订购服务,但在准确地将数据表保存到文件中时遇到了困难,该文件将在程序重新启动时加载

我的表包含一个名为“MessageHistory”的列,该列的列表类型(KeyValuePair)保存为空

我的桌子看起来像:

Clients.Columns.AddRange(新数据列(){
新数据列(“CodedPhoneNumber”,GetType(String)),
新数据列(“FriendlyPhoneNumber”,GetType(String)),
新数据列(“名称”,GetType(字符串)),
新数据列(“CurrentOrder”,GetType(String)),
新数据列(“OrderHistory”,GetType(String)),
新数据列(“TabBalance”,GetType(Int32)),
新数据列(“MessageHistory”,GetType(列表(KeyValuePair的列表(日期时间的列表,字符串))))
该表将保存到以下文件:

Dim流作为新的System.IO.MemoryStream()
Dim格式化程序为System.Runtime.Serialization.IFormatter=New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
序列化(流、客户端)
Dim TableBytes As Byte()=stream.GetBuffer()
File.writealBytes(文件路径,TableBytes)
在保存之前,我的KeyValuePairs列看起来是这样的(抱歉,还没有足够的声誉来嵌入图片):

保存的文件将该列注册为:


因为XML是空的,所以在将表加载回程序时,它会将每个条目作为默认的Datetime值复制,而不复制其他内容

所以我的问题是,如果列不是由一维字母数字值组成的(所有其他列都保存并加载良好),是否有更好的方法保存表

随着我的程序的发展,这个表可能会包括其他数组列类型


谢谢大家

我想出了一个解决方案。它不优雅,但很管用

我将KeyValuePair(DateTime,String)的列表提取到这些列表的临时列表中,并将其保存到单独的文件中

Dim MessageHistory作为新列表(列表的(键值对的)(日期时间的,字符串的)))
对于Clients.Rows中的每一行
添加(行(“MessageHistory”))
下一个
Dim Stream2作为新的System.IO.MemoryStream()
序列化(Stream2,MessageHistory)
Dim HistoryBytes As Byte()=Stream2.GetBuffer
File.writealBytes(MessageHistoryPath,HistoryBytes)
然后分别加载原始表和MessageHistory,并重新整合它们

Dim FileBytes As Byte()=File.ReadAllBytes(ClientFilePath)
Dim流作为新System.IO.MemoryStream(文件字节)
Dim格式化程序为System.Runtime.Serialization.IFormatter=New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Clients=DirectCast(格式化程序.反序列化(流),数据表)
FileBytes=File.ReadAllBytes(MessageHistoryPath)
Dim stream2作为新的System.IO.MemoryStream(文件字节)
Dim MessageHistory作为新列表(列表的(键值对的)(日期时间的,字符串的)))
MessageHistory=DirectCast(格式化程序.反序列化(stream2),列表(列表(键值对(日期时间,字符串))的列表)
对于i=0到Clients.Rows.Count-1
Clients.Rows(i).Item(“MessageHistory”)=(MessageHistory(i))
下一个

试试这个:Clients.WriteXml(“文件名”,XmlWriteMode.WriteSchema);DataTable似乎是一个奇怪的选择,原因是什么?序列化代码存在多个问题。您可以使用简单的POCO对象列表和JSON序列化,这将更有效。@jdweng,该代码产生相同的结果。为了简单起见,我选择DataTable而不是SQL server。因为表c轻松保存所有信息,每个衍生的SMS会话都可以启动一个类,其中包含一个Datarow变量,该变量保存重新插入主表的所有信息,这感觉非常适合,无需外部应用程序。我没有意识到保存表会成为一个问题。我假设它只是一个二进制文件RAM中保存的内容的字节表示。显然我错了。您的结果是否有架构?是的,结果可能相同,但有架构,然后使用Client.ReadXml(“filename”)方法应给出正确的结果。架构将读取与保存时相同的数据。