Almacenar algo que no sea una cadena en SuspensionManager.SessionState

Las aplicaciones de muestra incluyen una clase de administrador de suspensión que almacena el estado de la sesión en un diccionario, pero nunca intenta almacenar nada excepto una cadena en él.

Cada vez que almaceno algo más que una cadena, luego activo la serialización, aparece el siguiente error

No se espera el tipo 'System.RuntimeType' con el nombre del contrato de datos 'RuntimeType: http: //schemas.datacontract.org/2004/07/System'. Considere usar un DataContractResolver o agregue cualquier tipo no conocido estáticamente a la lista de tipos conocidos, por ejemplo, usando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos pasados ​​a DataContractSerializer.

¿Tengo que hacer algo más para poder almacenar otros tipos en SessionState?

preguntado el 03 de mayo de 12 a las 17:05

2 Respuestas

Tendrás que hacer dos cosas:

En primer lugar, asegúrese de que el tipo que está (des) serializando esté decorado con el DataContract atributo de System.Runtime.Serialization y asegúrese de que sus miembros estén decorados apropiadamente. Por ejemplo en C#:

[DataContract]
public struct Product
{
     [DataMember]
     public Guid Id { get; set; }

     [DataMember]
     public DateTime ManufactureDate { get; set; }

     [DataMember]
     public decimal Cost { get; set; }  
}

En segundo lugar, deberá llamar a SessionManager's AddKnownType<T>() (siendo T el tipo que necesita) antes de intentar (des) serializarlo.

Respondido 02 ago 12, 14:08

Para el segundo paso, ¿te refieres a SuspensionManager.KnownTypes.Add(T)? - diadina

@diadyne Cualquiera de los dos funciona, creo. SuspensionManager tiene un método AddKnownType () que llama a KnownTypes.Add(typeof(T)) - ashleym

mirando el código de SessionManager, solo hay tipos de cadena, supongo que tendrá que 'hacer el suyo propio' http://code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2/sourcecode?fileId=43552&pathId=6033729

Respondido el 01 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.