2011-07-05 15 views
5

Estoy usando el DataContractSerializer en .NET 3.5 para deserializar xml. El xml se serializó previamente de un grupo de entidades relacionadas en un modelo de entidad, respaldado por el marco de entidad 3.5. Hay muchas referencias, y el xml contiene extensamente todos los valores de los miembros y claves de cada entidad a la que se hace referencia.DataContractSerializer no deserializa referencias

La entidad de nivel superior se deserializa, pero las entidades a las que se hace referencia no.

Este es el código que estoy usando para serializar y deserializar:

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

Este es un fragmento del 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> 

He estado atrapado en esto durante un par de días y he agotado todos los resultados de búsqueda que pude encontrar. El uso de esta técnica puede evitar escribir a mano toneladas de código para cada tipo de entidad en nuestro modelo, de los cuales hay 143.

Por lo tanto, para reiterar, la entidad de nivel superior se deserializa, pero las entidades a las que se hace referencia no. Así que Asset está cargado y Asset.AssetCategory (entre muchos más) se resuelve a nulo después de la deserialización, y necesito ayuda para arreglarlo para que todas las referencias sean instanciadas. Por favor, ¿alguien?

+2

Salida "KnownTypes" – Steve

Respuesta

2

A veces necesita decirle al serializador acerca de otros "Tipos conocidos".

Consulte la documentación de MSDN:

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

Usted puede hacer esto a través de la configuración, a través de atributos, o por medio de parámetros/una propiedad en DataContractSerializer.

Hay un ejemplo completo los vínculos de documentación a aquí:

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

+0

Esto parece prometedor. Lo intentaré por la mañana. Muy apreciado. – Jack

+0

No hay problema :) Avíseme cómo funciona para usted. – Steve

Cuestiones relacionadas