2010-06-03 12 views
5

W poniższym przykładzie wstawiam ciąg znaków w konstruktorze, który jest w porządku. Jednak gdy deserializuję obiekt z binarnego formatyzatora, nie sądzę, aby łańcuch był internowany, ponieważ powinien on wywoływać konstruktora. W jaki sposób powinienem zapewnić internalizację łańcucha _name? ... czy będzie internowany w porządku?Jak powinienem obsługiwać napis Internowanie przy deserializacji?

Edit: Wydaje się więc do pracy (stażyści ciągi poprawnie) bez obsługi OnDeserializedAttribute. Jak to robi?

Używam profilera pamięci, z lub bez metody poniżej nadal internuje ciągi? Magia? : -/

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

Dzięki

[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

Dlaczego wyraźnie Intern ciąg? To jest wewnętrzny mechanizm .net. – Andrey

Odpowiedz

2

Jest to możliwe, jeśli zaimplementować interfejs ISerializable (nie Attribute). Pozwoli to na przeprowadzenie deserializacji.

Ale wydaje się bardzo niepotrzebne. Czy na pewno coś z tym robisz?

+3

tak. zapisywanie pamięci – DayOne

+1

To jest mikrooptymalizacja ... musisz mieć naprawdę dobry powód, jak na przykład praca z systemem wbudowanym, aby mieć to jako powód do internowania. – Dykam

+2

Mam dobre powody do radości – DayOne

Powiązane problemy