2011-07-05 16 views
5

.NET 3.5でDataContractSerializerを使用してxmlを逆シリアル化しています。 xmlは、エンティティフレームワーク3.5に基づいてエンティティモデル内の関連エンティティのグループから以前にシリアル化されていました。多くの参照があり、xmlには参照される各エンティティのメンバーとキーのすべての値が広範囲に含まれています。DataContractSerializerが参照を逆シリアル化しない

トップレベルのエンティティはデシリアライズされますが、参照されたエンティティはデリアライズしません。

これは私がシリアライズおよびデシリアライズするために使用しているコードです:

public static T DCDeserializeXml<T>(string xml) 
    { 
     MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(xml)); 
     using (
     XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.Unicode, 
        new XmlDictionaryReaderQuotas(), null)) 
     { 
      DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(T), null, Int32.MaxValue, false, true, null); 
      return (T)dataContractSerializer.ReadObject(reader, true); 
     } 
    } 

    public static string DCSerializeToXml<T>(T obj) 
    { 
     DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(T), null, Int32.MaxValue, false, true, null); 

     String text; 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      dataContractSerializer.WriteObject(memoryStream, obj);     
      byte[] data = new byte[memoryStream.Length]; 
      Array.Copy(memoryStream.GetBuffer(), data, data.Length); 
      text = Encoding.UTF8.GetString(data); 
     } 
     return text; 
    } 

これはXMLの抜粋です:

<?xml version="1.0" encoding="utf-8"?> 
<Assets> 
    <Asset z:Id="i1" xmlns="http://schemas.datacontract.org/2004/07/XLayer" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
     <EntityKey z:Id="i2" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data"> 
      <a:EntityContainerName>XModelContainer</a:EntityContainerName> 
      <a:EntityKeyValues> 
       <a:EntityKeyMember> 
        <a:Key>AssetGUID</a:Key> 
        <a:Value i:type="z:guid">7424f615-43db-4834-b15a-5befa46bfd55</a:Value> 
        </a:EntityKeyMember></a:EntityKeyValues> 
        <a:EntitySetName>AssetSet</a:EntitySetName> 
        </EntityKey> 
        <AssetGUID>7424f615-43db-4834-b15a-5befa46bfd55</AssetGUID> 
        <Created>2011-06-23T13:34:12.893</Created> 
        <Description/> 
        <npAudioInfoReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"> 
         <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data"/> 
        </npAudioInfoReference> 
        <npCampaigns/> 
        <npCategory z:Id="i3"> 
         <EntityKey z:Id="i4" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data"> 
          <a:EntityContainerName>XModelContainer</a:EntityContainerName> 
          <a:EntityKeyValues> 
           <a:EntityKeyMember> 
            <a:Key>CategoryID</a:Key> 
            <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1</a:Value> 
           </a:EntityKeyMember> 
          </a:EntityKeyValues> 
          <a:EntitySetName>AssetCategorySet</a:EntitySetName> 
         </EntityKey> 
         <AM_DataDocumentTypes/> 
         <CategoryID>1</CategoryID> 
         <CategoryName>Generic Content</CategoryName> 
         <npAssets> 

私は数日のために、この上で立ち往生してきました私は見つけることができるすべての検索結果を使い果たしました。このテクニックを使用すると、モデル内の各エンティティタイプのコードを手作業で書くのを避けることができます。このモデルでは、143があります。

これを繰り返しても、最上位レベルのエンティティはデシリアライズされます。だからAssetがロードされ、AssetCategory(さらに多くのものの中で)はデシリアライズ後にnullに解決され、すべてのリファレンスがインスタンス化されるように修正するのに役立つ必要があります。どうぞ、誰ですか?

+2

チェックアウト "KnownTypes" – Steve

答えて

2

シリアライザに他の「既知のタイプ」について伝える必要があることがあります。

は、MSDNのドキュメントを参照してください:

http://msdn.microsoft.com/en-us/library/ms730167.aspx

あなたは属性によって、またはパラメータ/ DataContractSerializerのプロパティを介して、設定を介してこれを行うことができます。

フル例ここまでのドキュメントへのリンクがあります:

http://msdn.microsoft.com/en-us/library/ms751512.aspx

+0

これは有望に見えるが。私はそれを朝に行ってくれるでしょう。非常に高く評価。 – Jack

+0

問題はありません:)それはあなたのためにどのように動作するか教えてください。 – Steve

関連する問題