2009-07-03 29 views
8

我正在研究一種WCF服務的「存儲轉發」應用程序。我想將消息保存爲數據庫中的原始XML Blob,如XElement。我在將datacontract轉換爲數據庫調用所需的XElement類型時遇到了一些麻煩。有任何想法嗎?在數據庫中將DataContract存儲爲XML

+1

的XElement是不一樣的 「原始XML二進制大對象」。前者是一種類型,便於使用XML進行此操作。另一個是具有特定格式的字符串。您可以將任何使用[DataContract]裝飾的類型保存爲XML字符串。 (見下面的例子)。 XElement - 你可以坐在你的書櫃上,你不需要它。 – Cheeso 2009-07-03 05:04:55

回答

12

它返回它作爲一個字符串,就可以投入將數據庫導入一個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。

+0

這不適合我。請參閱下面的user224125的答案。 – 2011-02-24 17:19:18

1

我不知道最有效的方式得到它的的XElement,但它得到一個字符串只需運行:

DataContractSerializer serializer = new DataContractSerializer(typeof(Foo)); 
using (MemoryStream memStream = new MemoryStream()) 
{ 
    serializer.WriteObject(memStream, fooInstance); 
    byte[] blob = memStream.ToArray(); 
} 
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(); 
       } 
      } 
     } 
    } 
} 
1

我試圖用使用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解決方案無法正常工作。

8

答案最多(傑森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; 
} 
+0

感謝您的鏈接。 – 2010-12-01 20:09:52