我正在研究一種WCF服務的「存儲轉發」應用程序。我想將消息保存爲數據庫中的原始XML Blob,如XElement。我在將datacontract轉換爲數據庫調用所需的XElement類型時遇到了一些麻煩。有任何想法嗎?在數據庫中將DataContract存儲爲XML
回答
它返回它作爲一個字符串,就可以投入將數據庫導入一個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();
}
btw,你使用LINQ到SQL?我問的原因是因爲你的問題的XElement部分。如果是這種情況,你可以在.dbml設計器中修改這個來使用一個字符串作爲CLR類型,而不是默認的XElement。
這不適合我。請參閱下面的user224125的答案。 – 2011-02-24 17:19:18
我不知道最有效的方式得到它的的XElement,但它得到一個字符串只需運行:
DataContractSerializer serializer = new DataContractSerializer(typeof(Foo));
using (MemoryStream memStream = new MemoryStream())
{
serializer.WriteObject(memStream, fooInstance);
byte[] blob = memStream.ToArray();
}
如果你的數據庫是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();
}
}
}
}
}
我試圖用使用StringBuilder的傑森w'Serialize功能,但它返回空字符串LingToSQL設計師生成的表類 使用[DataContract()]屬性
但是如果我serialze到字節數組由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解決方案無法正常工作。
答案最多(傑森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;
}
感謝您的鏈接。 – 2010-12-01 20:09:52
- 1. 將關係數據庫存儲爲XML
- 2. 如何將XML數據存儲在iPhone上的數據庫中?
- 3. 在數據庫中存儲XML文件
- 4. 將base64數據存儲在XML中?
- 5. 我可以將XML作爲XML存儲在Sqlite3數據庫中嗎?
- 6. 數據庫設計:如何在數據庫中存儲XML/JSON?
- 7. PHP - 將XML轉換爲PHP中的數組 - 在php中解析soap xml並將其存儲在數據庫中
- 8. xml如何存儲在數據庫
- 9. 將XML存儲在關係數據庫中的基本原理
- 10. 您何時選擇將XML存儲在關係數據庫中?
- 11. 在oracle數據庫中將數據存儲爲特定時間
- 12. 將配置存儲在數據庫中
- 13. 將用戶存儲在數據庫中
- 14. 將MKPolygon存儲在Realm數據庫中
- 15. 將翻譯存儲在數據庫中?
- 16. 將發票存儲在數據庫中
- 17. 將圖片存儲在數據庫中?
- 18. 將歷史存儲在數據庫中
- 19. 將json存儲在msSQL數據庫中?
- 20. 將考勤存儲在數據庫中
- 21. 如何將XML數據存儲到SQLite數據庫
- 22. 讀取XML文件並將數據存儲到mysql數據庫
- 23. 以xml格式在數據庫中存儲soap xml響應
- 24. 是否可以將XpsDocuments序列化爲XML以便存儲在數據庫中?
- 25. Phonegap數據庫問題 - 將圖像存儲在數據庫中
- 26. 將數據存儲在txt/xml文件中,讀取/寫入數據庫?
- 27. 將xml文檔存儲到數據庫中?
- 28. 解析XML文件並將其存儲到數據庫中
- 29. 將Unicode數據存儲在SQL Server 2008中XML數據類型
- 30. 將XML數據存儲在覈心數據中
的XElement是不一樣的 「原始XML二進制大對象」。前者是一種類型,便於使用XML進行此操作。另一個是具有特定格式的字符串。您可以將任何使用[DataContract]裝飾的類型保存爲XML字符串。 (見下面的例子)。 XElement - 你可以坐在你的書櫃上,你不需要它。 – Cheeso 2009-07-03 05:04:55