.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に解決され、すべてのリファレンスがインスタンス化されるように修正するのに役立つ必要があります。どうぞ、誰ですか?
チェックアウト "KnownTypes" – Steve