Estoy trabajando en una especie de aplicación "store and forward" para servicios WCF. Quiero guardar el mensaje en una base de datos como un blob XML sin formato, como XElement. Estoy teniendo problemas para convertir el contrato de datos en el tipo XElement que necesito para la llamada a la base de datos. ¿Algunas ideas?Persista un DataContract como XML en una base de datos
Respuesta
Esto devuelve como una cadena, que se puede poner en el db en una columna xml Aquí hay un buen método genérico que puede usar para serializar los contactos de datos.
public static string Serialize<T>(T obj)
{
StringBuilder sb = new StringBuilder();
DataContractSerializer ser = new DataContractSerializer(typeof(T));
ser.WriteObject(XmlWriter.Create(sb), obj);
return sb.ToString();
}
btw, ¿estás usando linq en sql? La razón por la que pregunto es por la parte XElement de su pregunta. si ese es el caso, puede modificar esto en el diseñador de .dbml para usar una cadena como el tipo CLR, y no el XElement predeterminado.
Esto no funcionó para mí. Ver la respuesta de user224125 a continuación. –
No estoy seguro acerca de la forma más eficiente para llegar a un XElement, pero para llegar a una cadena acaba de correr:
DataContractSerializer serializer = new DataContractSerializer(typeof(Foo));
using (MemoryStream memStream = new MemoryStream())
{
serializer.WriteObject(memStream, fooInstance);
byte[] blob = memStream.ToArray();
}
Si su base de datos es SQL Server 2005 o superior, se puede utilizar el tipo de datos XML:
private readonly DataContractToSerialize _testContract =
new DataContractToSerialize
{
ID = 1,
Name = "One",
Children =
{
new ChildClassToSerialize {ChildMember = "ChildOne"},
new ChildClassToSerialize {ChildMember = "ChildTwo"}
}
};
public void SerializeDataContract()
{
using (var outputStream = new MemoryStream())
{
using (var writer = XmlWriter.Create(outputStream))
{
var serializer =
new DataContractSerializer(_testContract.GetType());
if (writer != null)
{
serializer.WriteObject(writer, _testContract);
}
}
outputStream.Position = 0;
using (
var conn =
new SqlConnection(Settings.Default.ConnectionString))
{
conn.Open();
const string INSERT_COMMAND =
@"INSERT INTO XmlStore (Data) VALUES (@Data)";
using (var cmd = new SqlCommand(INSERT_COMMAND, conn))
{
using (var reader = XmlReader.Create(outputStream))
{
var xml = new SqlXml(reader);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Data", xml);
cmd.ExecuteNonQuery();
}
}
}
}
}
He intentado utilizar la función Jason w'Serialize que utiliza StringBuilder, pero devuelve cadena vacía para LingToSQL diseñador generada clase mesa con una cadena XML legible [DataContract()] atribuir
Sin embargo si serialze de matriz de bytes según lo sugerido por AgileJon
y luego usar UTF7Encoding para convertir a cadena, se crea.
static string DataContractSerializeUsingByteArray<T>(T obj)
{
string sRet = "";
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
using (MemoryStream memStream = new MemoryStream())
{
serializer.WriteObject(memStream, obj);
byte[] blob = memStream.ToArray();
var encoding= new System.Text.UTF7Encoding();
sRet = encoding.GetString(blob);
}
return sRet;
}
No estoy seguro de por qué la solución de stringBuilder no funciona.
La respuesta más votada (Jason W. publicado) no funcionó para mí. No sé por qué esa respuesta obtuvo la mayoría de los votos. Pero después de buscar en torno encontré este
http://billrob.com/archive/2010/02/09/datacontractserializer-converting-objects-to-xml-string.aspx
que funcionó para mi proyecto. Acabo de tener algunas clases y poner los atributos de contrato de datos y datamemeber en clases y propiedades y luego quería obtener una cadena XML que podía escribir en la base de datos.
Código desde el enlace de arriba en caso que se va 404:
Serializa:
var serializer = new DataContractSerializer(tempData.GetType());
using (var backing = new System.IO.StringWriter())
using (var writer = new System.Xml.XmlTextWriter(backing))
{
serializer.WriteObject(writer, tempData);
data.XmlData = backing.ToString();
}
Deserializa:
var serializer = new DataContractSerializer(typeof(T));
using (var backing = new System.IO.StringReader(data.XmlData))
using (var reader = new System.Xml.XmlTextReader(backing))
{
return serializer.ReadObject(reader) as T;
}
Gracias por el enlace. –
- 1. serialización XML de DataContract y atributos XML
- 2. utilizando xml como base de datos en php
- 3. Cómo agrego un atributo XML usando DataContract
- 4. Incluyendo comentarios XML en DataContract Serializer Metadata
- 5. ¿Cómo almaceno datos XML en una base de datos mysql? No quiero claves externas como loca
- 6. Inteligente o no: Persista datos serializados (dotnet-protobuf, protobuf-net, json) en una base de datos relacional en CF
- 7. Datos de WCF DataContract ¿Orden del miembro?
- 8. Cómo serializar/deserializar un C# WCF DataContract a/desde XML
- 9. cómo marcar una interfaz como DataContract en WCF
- 10. Rieles: ¿Cómo puedo llamar `self.save` en mi modelo y que persista en la base de datos?
- 11. ¿Es "malo" almacenar XML en una base de datos?
- 12. Tabla de base de datos o XML
- 13. para almacenar datos XML como XML o en tablas normalizadas
- 14. Modelado: Xml vs. Base de datos relacional
- 15. Cómo construir una base de datos a partir de un esquema XSD e importar datos XML
- 16. Cómo serializar y guardar un objeto de base de datos como XML utilizando LINQ to SQL
- 17. insertar nulo como valor entero en una base de datos
- 18. Cómo convertir una base de datos MySQL a XML?
- 19. usando Google Docs como base de datos?
- 20. Almacenamiento de datos XML en la base de datos: muchas tablas frente a volcar xml en una columna
- 21. WCF Datacontract: ¿Admite miembros de datos anulables?
- 22. Cómo leer una sección de configuración de XML en una base de datos?
- 23. ¿Cuándo se llama una base de datos como base de datos incrustada?
- 24. Exportación de una base de datos SQLite a un archivo XML en Android
- 25. Xml o Sqlite, Cuándo soltar Xml para una base de datos?
- 26. ¿Tiene algún inconveniente para almacenar un número entero como una cadena en una base de datos?
- 27. Usar una tabla de base de datos como cola
- 28. Android: ¿enlazar datos de una base de datos a un CheckBox en un ListView?
- 29. MongoDB como la base de datos principal?
- 30. HSQL base de datos en la memoria como fuente de datos JPA
XElement no es lo mismo que "blob XML sin procesar". El primero es un tipo, útil para hacer esto con XML. El otro es una cadena con un formato particular. Puede guardar desde cualquier tipo decorado con [DataContract] en cadenas XML. (Ver abajo para ejemplos). El XElement: puedes sentarte en tu credenza, no lo necesitas. – Cheeso