La serialización de un objeto con una imagen que se guarda en la base de datos SQL
-
13-09-2019 - |
Pregunta
Tengo el objeto siguiente:
[Serializable]
public class ExampleImage
{
public int ID { get; set; }
public string Filename { get; set; }
public byte[] Content { get; set; }
}
guardo esto en un List<ExampleImage>
que luego me pase a la siguiente función para serializar en una cadena:
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();
}
I a continuación, pasar esta cadena serializado a un procedimiento almacenado en SQL2000 como un NTEXT
que luego manejado para insertarlo en la base de datos:
SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')
El problema que estoy teniendo es la imagen que se evita caidas. El btye[]
no está siendo guardado correctamente a la base de datos. Los otros campos están bien. Esta es la primera vez que tengo intento de enviar un conjunto de datos binarios a través de XML a SQL, así que estoy muy probablemente haciendo algo mal en este punto. Es mi función SerializeObjectToXmlString
el problema y no está manejando la serialización de un byte[]
correctamente, puede que la función OpenXML
SQL o incluso el hecho de que estoy enviando el código XML en como un parámetro NTEXT
. Yo esperaría que la función serialize para codificar el binario adecuadamente, pero podría estar equivocado.
Cualquier idea de lo que es el tema o tal vez un mejor enfoque para guardar un montón de imágenes a la vez?
Editar Creo que lo que está sucediendo, se está haciendo el serializador la byte[]
en una cadena de base 64, que a su vez está consiguiendo pasa al procedimiento almacenado como base 64. entonces yo estoy ahorrando esta cadena de base 64 en un campo de imagen en SQL y leerlo como un btye[]
. Así que creo que tengo que conseguir de alguna manera de base 64 a un byte[]
antes de insertarlo en mi mesa?
Editar Estoy empezando a pensar que mi única opción es cambiar el procedimiento almacenado que acaba de hacer 1 imagen a la vez y no utilizar XML y sólo tiene que pasar en el byte[]
como un tipo Image
y envoltura todas las llamadas en una transacción.
Solución
Como sugirió Gaidin, base 64 es la mejor opción. Es la forma habitual de escribir datos binarios a XML. Usted puede utilizar el siguiente código:
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); }
}
}
(por cierto, el atributo Serializable
no tiene ningún significado para la serialización XML)
Otros consejos
En lugar de serializar a XML, me serializarlo a un byte [] y almacenar que en varbinary (max) tipo de campo en su base de datos.
Usted podría tratar de convertirlo en base 64, y luego guardarlo en el campo de texto o algo así.