2009-07-03 11 views
8

私は、WCFサービスのための一種の「ストアアンドフォワード」アプリケーションを開発中です。私はXElementとして生のXMLブロブとしてデータベースにメッセージを保存したいと思います。私はdatacontractをデータベース呼び出しのために必要なXElement型に変換するのに少し問題があります。何か案は?DataContractをデータベースとしてXMLとして保存する

+1

のXElementは "生のXMLブロブ" と同じではありません。前者はXMLでこれを行うのに便利な型です。もう1つは、特定の形式の文字列です。 [DataContract]で装飾された任意の型からXML文字列に保存できます。 (例については下記を参照)。 XElement - それはあなたの信用センタに座ることができます、あなたはそれを必要としません。 – Cheeso

答えて

12

これはあなたがに入れることができ、文字列、としてそれを返します。 dbをXML列に変換します。ここでは、datacontractsをシリアライズするのに使用できる良い汎用メソッドです。

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 to sqlを使用していますか?私が尋ねる理由はあなたの質問のXElementの部分のためです。その場合、.dbmlデザイナーでこれを変更して、デフォルトのXElementではなくCLR型として文字列を使用することができます。データベースがSQL Server 2005または上記の場合

+0

これは私のためには機能しませんでした。以下のuser224125の回答を参照してください。 –

1

私はXElementオブジェクトにそれを得るための最も効率的な方法についてはよく分からないんだけど、ただ実行する文字列にそれを得るために:

DataContractSerializer serializer = new DataContractSerializer(typeof(Foo)); 
using (MemoryStream memStream = new MemoryStream()) 
{ 
    serializer.WriteObject(memStream, fooInstance); 
    byte[] blob = memStream.ToArray(); 
} 
2

は、あなたが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()]

属性がAgileJon

によって提案され、その後、文字列に変換しUTF7Encodingを使用して、私はバイト配列にserialzeた場合、それが作成読める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

最も投票された回答(Jason W. posted)は私には役に立たなかった。私はその答えが最も票を集めた理由を知らない。しかし、周りに検索した後、私は私のプロジェクトのために働いていたこの

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

リンクをありがとう。 –

関連する問題