2017-01-21 10 views
0

Я создаю службу заказа SMS для ресторана, и у меня возникают трудности с сохранением файла Datatable в файле, который затем загружается при перезапуске программы ,Сохраните DataTable в файл, где указан тип столбца (KeyValuePair ...)

В моей таблице содержится столбец с именем «MessageHistory» с типом списка (KeyValuePair), который сохраняется как пустой.

Моя таблица выглядит следующим образом:

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))))}) 

таблица сохраняется в файл:

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 является пустым, при загрузке таблицы обратно в программу копирует каждую запись в качестве значения по умолчанию Datetime с ничего.

Итак, мой вопрос в том, есть ли лучший способ сохранить таблицу, учитывая, что столбцы не состоят просто из одномерных буквенно-цифровых значений (все остальные столбцы сохраняют и загружают в порядке)?

Как моя программа развивается, вполне возможно, что эта таблица будет включать в себя другие типы столбцов массива.

Благодарности Ребята

+0

попробовать это:. Clients.WriteXml («имя файла», XmlWriteMode.WriteSchema); – jdweng

+1

DataTable кажется странным выбор, что причина, что Есть несколько вопросов с кодом сериализации? – Plutonix

+0

Вы можете использовать простой POCO o bject и использовать сериализацию JSON, которая будет более эффективной. –

ответ

0

Вот решение, которое я придумал. Это не изящно, но это работает.

я извлечь список (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) 

я затем загрузить как исходную таблицу, и 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