Serializzazione di un oggetto con un'immagine da salvare nel database SQL
-
13-09-2019 - |
Domanda
Ho il seguente oggetto:
[Serializable]
public class ExampleImage
{
public int ID { get; set; }
public string Filename { get; set; }
public byte[] Content { get; set; }
}
I memorizzare questo in un List<ExampleImage>
che ho poi passare alla funzione seguente per serializzare in una stringa:
static string SerializeObjectToXmlString(object o)
{
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(o.GetType());
System.IO.StringWriter writer = new System.IO.StringWriter();
serializer.Serialize(writer, o);
return writer.ToString();
}
Ho poi passare questa stringa serializzata ad una procedura immagazzinata in SQL2000 come NTEXT
che poi trattati per inserirla nel database:
SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')
Il problema che sto avendo è l'immagine è sempre cestinato. Il btye[]
non è sempre salvato correttamente al DB. Gli altri campi sono più che bene. Questa è la prima volta che ho tenta di inviare un dati binari tramite XML di SQL in modo che sto molto probabilmente facendo qualcosa di sbagliato, a questo punto. È la mia funzione SerializeObjectToXmlString
il problema e che non gestisce la serializzazione di un byte[]
correttamente, forse la funzione OpenXML
SQL o anche il fatto che io mando il XML in come param NTEXT
. Mi aspetterei la funzione Serialize per codificare il binario correttamente, ma potrei sbagliarmi.
Qualche idea di cosa è la questione, o forse un approccio migliore per salvare un gruppo di immagini contemporaneamente?
Modifica Penso che quello che sta accadendo, è il serializzatore sta facendo il byte[]
in una stringa Base64, che è poi sempre passato insieme al proc memorizzato come Base64. Sto quindi salvare questa stringa base64 in un campo Immagine in SQL e leggerlo come un btye[]
. Quindi penso che ho bisogno di ottenere in qualche modo da Base64 ad un byte[]
prima di inserirlo nel mio tavolo?
Modifica sto iniziando a pensare che la mia unica opzione è quella di cambiare il proc memorizzato per fare solo 1 immagine per volta e non utilizzare XML e basta passare in byte[]
come un tipo Image
e impacco tutte le chiamate in una transazione.
Soluzione
Come suggerito Gaidin, base64 è l'opzione migliore. E 'il solito modo di scrittura dei dati binari in XML. È possibile utilizzare il seguente codice:
public class ExampleImage
{
public int ID { get; set; }
public string Filename { get; set; }
[XmlIgnore]
public byte[] Content { get; set; }
[XmlElement("Content")]
public string ContentBase64
{
get { return Convert.ToBase64String(Content); }
set { Content = Convert.FromBase64String(value); }
}
}
(a proposito, l'attributo Serializable
non ha alcun significato per la serializzazione XML)
Altri suggerimenti
Invece di serializzazione a XML, vorrei serializzare a un byte [] e memorizzare che nel varbinary (max) Tipo di campo nel DB.
Si potrebbe provare a convertirlo in Base64, poi salvarlo sul campo TEXT o qualcosa del genere.