2010-06-03 13 views
5

En el siguiente ejemplo, estoy intercediendo la cadena en el constructor, lo cual está bien. Sin embargo, cuando deserializo el objeto del formateador binario, no creo que la cadena se interne, ya que se debe invocar al constructor. ¿Cómo debo asegurarme de que la cadena _name esté interna? ... o será internado ¿de acuerdo?¿Cómo debo manejar cadenas Interning en deserialización?

Edit: Así que parece que funciona (interns las cadenas correctamente) sin manejar el OnDeserializedAttribute. ¿Como hace eso?

Estoy usando un generador de perfiles de memoria, con o sin el método que se muestra a continuación, todavía interne las cadenas? ¿Magia? : -/

[OnDeserializedAttribute] 
    private void OnDeserialized(StreamingContext context) 
    { 
     _name = string.Intern(_name); 
    } 

Gracias

[Serializable] 
class City 
{ 
    private readonly string _name; 

    public City(string t) 
    { 
     _name = string.Intern(t); 
    } 

    public string Name 
    { 
     get { return _name; } 
    } 

    public override string ToString() 
    { 
     return _name; 
    } 
} 
+1

¿por qué explícitamente Intern string? Este es el mecanismo interno de .net. – Andrey

Respuesta

2

Esto es posible si se implementa la interfaz ISerializable (no el atributo). Te permitirá hacer la deserialización.

Pero parece muy innecesario. ¿Estás seguro de que estás logrando algo con esto?

+3

sí. memoria de guardado – DayOne

+1

Eso es una micro optimización ... debe tener una muy buena razón, como trabajar con un sistema integrado, para tener eso como razón para Interning. – Dykam

+2

tengo buenas razones para animarme – DayOne

Cuestiones relacionadas