将 DataTable 保存到文件,其中列类型是列表(KeyValuePair ...)

Save DataTable to file where column type is list(of KeyValuePair...)

我正在为餐厅构建 SMS 订购服务,但很难准确地将数据table 保存到文件中,该文件稍后会在程序重新启动时加载。

我的 table 包含一个名为 "MessageHistory" 的列,其类型为 List(of KeyValuePair),该列被保存为空。

我的 table 看起来像:

Clients.Columns.AddRange(New DataColumn() {
        New DataColumn("CodedPhoneNumber", GetType(String)),
        New DataColumn("FriendlyPhoneNumber", GetType(String)),
        New DataColumn("Name", GetType(String)),
        New DataColumn("CurrentOrder", GetType(String)),
        New DataColumn("OrderHistory", GetType(String)),
        New DataColumn("TabBalance", GetType(Int32)),
        New DataColumn("MessageHistory", GetType(List(Of KeyValuePair(Of DateTime, String))))})

table保存到文件:

 Dim stream As New System.IO.MemoryStream()
    Dim formatter As System.Runtime.Serialization.IFormatter = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
    formatter.Serialize(stream, Clients)

    Dim TableBytes As Byte() = stream.GetBuffer()

    File.WriteAllBytes(FilePath, TableBytes) 

保存之前,我的 KeyValuePairs 列看起来像这样(抱歉,还没有足够的声誉来嵌入图片):

MessageHistory in RAM

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

<MessageHistory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <KeyValuePairOfDateTimeString />
    <KeyValuePairOfDateTimeString />
    <KeyValuePairOfDateTimeString />
    <KeyValuePairOfDateTimeString />
  </MessageHistory>

由于 XML 为空,在将 table 加载回程序后,它会将每个条目复制为默认日期时间值,没有其他任何内容。

所以我的问题是如果列不是简单地由一维字母数字值组成(所有其他列都可以保存和加载),是否有更好的方法来保存 table?

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

谢谢大家

这是我想出的解决方案。它不优雅,但它有效。

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

Dim MessageHistory As New List(Of List(Of KeyValuePair(Of DateTime, String)))

    For Each Row In Clients.Rows
        MessageHistory.Add(Row("MessageHistory"))
    Next

    Dim Stream2 As New System.IO.MemoryStream()
    formatter.Serialize(Stream2, MessageHistory)

    Dim HistoryBytes As Byte() = Stream2.GetBuffer
    File.WriteAllBytes(MessageHistoryPath, HistoryBytes)

然后我分别加载原始 table 和 MessageHistory,然后重新整合它们。

        Dim FileBytes As Byte() = File.ReadAllBytes(ClientFilePath)
        Dim stream As New System.IO.MemoryStream(FileBytes)
        Dim formatter As System.Runtime.Serialization.IFormatter = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()

        Clients = DirectCast(formatter.Deserialize(stream), DataTable)

        FileBytes = File.ReadAllBytes(MessageHistoryPath)
        Dim stream2 As New System.IO.MemoryStream(FileBytes)

        Dim MessageHistory As New List(Of List(Of KeyValuePair(Of DateTime, String)))
        MessageHistory = DirectCast(formatter.Deserialize(stream2), List(Of List(Of KeyValuePair(Of DateTime, String))))

        For i = 0 To Clients.Rows.Count - 1
            Clients.Rows(i).Item("MessageHistory") = (MessageHistory(i))
        Next