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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top