我正在为WCF服务开发一种“存储转发”应用程序。我想将消息作为原始XML blob保存在数据库中,作为XElement。我在将datacontract转换为数据库调用所需的XElement类型时遇到了一些麻烦。有什么想法吗?
答案 0 :(得分: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();
}
顺便问一下,你使用linq来实现sql吗?我问的原因是因为问题的XElement部分。如果是这种情况,您可以在.dbml设计器中修改它以使用字符串作为CLR类型,而不是默认的XElement。
答案 1 :(得分: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();
}
反序列化:
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;
}
答案 2 :(得分:2)
如果您的数据库是SQL Server 2005或更高版本,则可以使用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();
}
}
}
}
}
答案 3 :(得分:1)
我不确定将它转换为XElement的最有效方法,但是要将其转换为字符串,只需运行:
DataContractSerializer serializer = new DataContractSerializer(typeof(Foo));
using (MemoryStream memStream = new MemoryStream())
{
serializer.WriteObject(memStream, fooInstance);
byte[] blob = memStream.ToArray();
}
答案 4 :(得分:1)
我尝试使用使用StringBuilder的Jason w'Serialize函数,但它为LingToSQL Designer生成的表类返回空字符串 使用[DataContract()]属性
但是,如果我按照AgileJon
的建议将其序列化为字节数组然后使用UTF7Encoding转换为字符串,它会创建可读的XML字符串。
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;
}
不确定为什么stringBuilder解决方案无效。