L'oggetto vb.net persiste nel database
-
09-06-2019 - |
Domanda
Come posso archiviare un oggetto definito dall'utente vb.net in un database SQL.Non sto cercando di replicare le proprietà con le colonne.Intendo qualcosa sulla falsariga di convertire o codificare il mio oggetto in un array di byte e quindi memorizzarlo in un campo nel db.Come quando memorizzi un'istanza di un oggetto in una sessione, ma ho bisogno che le informazioni persistano oltre la sessione corrente.
@Orion Edwards
Non è una questione di posizioni.È perché un giorno cambierai il tuo codice.Quindi proverai a deserializzare il vecchio oggetto e IL TUO PROGRAMMA ANDRÀ IN CRASH.
Il mio programma non andrà in "CRASH", genererà un'eccezione.Fortunatamente per me .net ha tutta una serie di lezioni dedicate a un'occasione del genere.A quel punto aggiornerò i miei dati obsoleti e li rimetterò nel db.Questo è il punto di questo campo (o posizione, a seconda dei casi).
Soluzione
Puoi usare serializzazione - ti permette di conservare il tuo oggetto almeno in 3 forme:binario (adatto per BLOB), XML (sfrutta il tipo di dati XML di MSSQL) o semplicemente testo (memorizza in varchar o colonna di testo)
Altri suggerimenti
Prima di intraprendere questa strada verso la tua eventuale follia, dovresti dare un'occhiata a questo (o ripeterlo un giorno):
http://thedailywtf.com/Articles/The-Mythical-Business-Layer.aspx
Mantenere gli oggetti in un database non è una buona idea.Uccide tutte le cose buone per cui un database è progettato.
Potresti usare il BinaryFormatter class per serializzare il tuo oggetto in un formato binario, quindi salva la stringa risultante nel tuo database.
XmlSerializer o DataContractSerializer in .net 3.x faranno il lavoro per te.
@aku, lomaxx e bdukes: le tue soluzioni sono ciò che stavo cercando.
@ 1800 INFORMAZIONI - anche se apprezzo la tua posizione in merito, questo è un caso speciale di dati che ottengo da un servizio web che viene aggiornato solo circa una volta al mese.Non ho bisogno che i dati persistano in formato DB perché è a questo che serve il servizio web.Di seguito è riportato il codice che finalmente ho potuto lavorare.
Serializzare
#'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)
Deserializzare
#'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)
Quello che vuoi fare si chiama "Serializzare" il tuo oggetto e .Net ha diversi modi per farlo.Una è la classe XmlSerializer nello spazio dei nomi System.Xml.Serialization.
Un altro si trova nello spazio dei nomi System.Runtime.Serialization.Supporta un formattatore SOAP, un formattatore binario e una classe base da cui puoi ereditare che implementano tutti un'interfaccia comune.
Per quello di cui stai parlando, il BinaryFormatter suggerito in precedenza avrà probabilmente le migliori prestazioni.
Sto sostenendo @ 1800 Informazioni su questo.
Serializzare oggetti per l'archiviazione a lungo termine non è mai una buona idea
anche se apprezzo la tua posizione in merito, questo è un caso speciale di dati che ottengo da un servizio web che viene aggiornato solo circa una volta al mese.
Non è una questione di posizioni.È perché un giorno cambierai il tuo codice.Quindi proverai a deserializzare il vecchio oggetto e IL TUO PROGRAMMA ANDRÀ IN CRASH.
Se si blocca (o genera un'eccezione) tutto ciò che rimane è un mucchio di dati binari da provare a vagliare per ricreare i tuoi oggetti.
Se stai persistendo solo in binario, perché non salvarlo direttamente su disco.Potresti anche prendere in considerazione l'utilizzo di qualcosa come xml poiché, come è stato menzionato, se modifichi la definizione dell'oggetto potresti non essere in grado di annullarne la serializzazione senza un duro lavoro.