2009-04-10 8 views
6

Ok, tengo DataContractSerializer trabajando con mi gráfico de objetos. Vea mis preguntas anteriores para más información.RuntimeType: http: //schemas.datacontract.org/2004/07/System 'no se espera

Serialization/Derialization of a tree structure

The deserializer has no knowlege of any type that maps to this contract

Sin embargo, uno de mis campos, _UserPropertyDefinitions, se define como se muestra a continuación .. Se define una lista de propiedades personalizadas que este usuario puede agregar a los objetos en la estructura de datos . La cadena es una clave única para identificar la propiedad, y Type es el tipo de propiedad que siempre es un tipo de primative como Bool, Int, String, etc.

Cada objeto tiene un correspondiente Dictionary (String key, valor del objeto) colección para almacenar los valores que se ha fijado para cualquiera de las "Propiedades de usuario"

[DataMember] 
private Dictionary<string, Type> _UserPropertyDefinitions; 

Mi gráfico de objetos serializa bien cuando esta propiedad es una colección vacía, sin embargo, una vez que agrego una propiedad personalizada a esta colección Obtengo la siguiente excepción al tratar de serializar con DataContractSerializer. No se espera :

Tipo 'System.RuntimeType' con los datos contrato nombre 'http://schemas.datacontract.org/2004/07/System RuntimeType'. Agregue cualquier tipo que no sea conocido estáticamente a la lista de tipos conocidos - por ejemplo, mediante el atributo KnownTypeAttribute o por agregándolos a la lista de tipos conocidos pasados ​​a DataContractSerializer.

Si elimino el atributo DataMember para este campo, puedo serializar/deserializar sin obtener una excepción, pero por supuesto pierdo la configuración que he creado en este campo.

+1

Disculpa las demoras en la respuesta ;-p O bien Type.GetType() o Assembly.GetType() –

Respuesta

7

Estoy bastante seguro de que Type no se serializará muy bien, y podría decirse que no pertenece a ningún contrato de datos, ya que (al ser específico de la implementación) infringe uno de los principales objetivos de un dato -Contrato ...

Sin embargo, espero que el mejor enfoque sería la de cambiar eso por un Dictionary<string,string>, utilizando el Type 's AssemblyQualifiedName o FullName.

+0

Geeze Marc ¿no tienes trabajo real que hacer? :-) Pero en serio, realmente aprecio la ayuda. Entonces, básicamente, almacenaría el nombre del Tipo, y luego recuperaría el Tipo real del nombre. Sé cómo encontrar el nombre del Tipo, pero ¿cómo recuperaré un Tipo más tarde cuando solo conozco el nombre? –

+0

@Marc Gravell ¿cómo recuperarías el tipo cuando solo tienes el nombre si no es un tipo de trabajo de campo conocido, , también enviarías el ensamblaje completo de alguna forma? –

+0

@eran, un AssemblyQualifiedName no es "solo" un nombre, pero sí es problemático, especialmente si los ensamblajes son diferentes. Si las dos implementaciones pueden categorizar sus tipos conocidos, ¿sería suficiente una enumeración? En protobuf-net, para serializar el Tipo I, deje que el usuario proporcione una implementación para el tipo <==>, para que puedan mapearlo manualmente. –

Cuestiones relacionadas