将DataContract作为XML保留在数据库中

Rob*_*ert 8 c# xml wcf datacontract

我正在为WCF服务开发一种"存储转发"应用程序.我想将消息作为原始XML blob保存在数据库中,作为XElement.我在将datacontract转换为数据库调用所需的XElement类型时遇到了一些麻烦.有任何想法吗?

jas*_*nmw 12

这会将其作为字符串返回,您可以将其放入db中的xml列中.这是一个很好的通用方法,可用于序列化数据交换.

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();
}
Run Code Online (Sandbox Code Playgroud)

顺便问一下,你使用linq来sql吗?我问的原因是因为问题的XElement部分.如果是这种情况,您可以在.dbml设计器中修改它以使用字符串作为CLR类型,而不是默认的XElement.


Eva*_*sen 8

答案最多(Jason W.发布)对我不起作用.我不知道为什么这个答案获得了最多的选票.但搜索后我发现了这个

http://billrob.com/archive/2010/02/09/datacontractserializer-converting-objects-to-xml-string.aspx

这适用于我的项目.我只是有一些类,并将datacontract和datamemeber属性放在类和属性上,然后想要获得一个XML字符串,我可以写入数据库.

来自上面链接的代码变为404:

连载:

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();
}
Run Code Online (Sandbox Code Playgroud)

反序列化:

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;
}
Run Code Online (Sandbox Code Playgroud)