2011-07-05 46 views
5

Tôi đang sử dụng DataContractSerializer trong .NET 3.5 để deserialize xml. Xml trước đây được tuần tự hóa từ một nhóm các thực thể liên quan trong một mô hình thực thể, được hỗ trợ bởi khung thực thể 3.5. Có nhiều tham chiếu và xml chứa tất cả các giá trị của các thành viên và khóa của mỗi thực thể được tham chiếu.DataContractSerializer không deserializing tài liệu tham khảo

Thực thể cấp cao nhất deserializes tốt, nhưng các thực thể tham chiếu thì không.

Đây là mã tôi đang sử dụng để serialize và deserialize:

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; 
    } 

Đây là một đoạn 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> 

Tôi đã bị mắc kẹt trên này cho một vài ngày và tôi đã cạn kiệt tất cả các kết quả tìm kiếm mà tôi có thể tìm thấy. Sử dụng kỹ thuật này rõ ràng có thể tránh viết tay tấn mã cho từng loại thực thể trong mô hình của chúng tôi, trong đó có 143.

Vì vậy, để nhắc lại, thực thể cấp cao deserializes tốt, nhưng các thực thể tham chiếu không. Vì vậy, Asset được nạp và Asset.AssetCategory (trong số nhiều thứ khác) giải quyết thành null sau khi deserialization, và tôi cần trợ giúp để sửa nó để tất cả các tham chiếu được khởi tạo. Xin vui lòng, bất cứ ai?

+2

Check-out "KnownTypes" – Steve

Trả lời

2

Đôi khi bạn cần phải thông báo cho bộ nối tiếp về "Các loại đã biết" khác.

Xem tài liệu MSDN:

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

Bạn có thể làm điều này thông qua việc cấu hình, thông qua các thuộc tính, hoặc thông qua các thông số/một tài sản trên DataContractSerializer.

Có một ví dụ đầy đủ các liên kết tài liệu để ở đây:

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

+0

này trông đầy hứa hẹn. Tôi sẽ cho nó đi vào buổi sáng. Rất nhiều đánh giá cao. – Jack

+0

Không phải là vấn đề :) Hãy cho tôi biết nó hoạt động như thế nào cho bạn. – Steve

Các vấn đề liên quan