Code Review: serializacja a właściwości

Załóżmy, że mamy następujący kod:

[Serializable]
class Person
{
    public string Name { get; set; }
}

Atrybut Serializable mówi, że będzie wspierana serializacja za pomocą IFormatter (np. BinaryFormatter). Jeśli chcemy wspierać ten mechanizm, zawsze powinniśmy tworzyć jawnie backing-field. Kompilator w końcu może wygenerować tak naprawdę dowolną nazwę. Zajrzyjmy do Reflector, aby zobaczyć jak wygląda wewnętrzna struktura:

 

image

Wygenerowane pole to:

[CompilerGenerated]
private string <Name>k__BackingField;

Nie ma żadnej gwarancji, że te automatycznie wygenerowane pole zawsze będzie miało taką samą nazwę. Serializacja dokonywana jest na podstawie pól a nie właściwości dlatego jest to tak ważne. Poprawna wersja to:

[Serializable]
class Person
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

Teraz nie jesteśmy skazani na implementację wewnętrzną kompilatora.

2 thoughts on “Code Review: serializacja a właściwości”

  1. Nie do końca się zgodzę z tym postem- twórcy kompilatorów to mądrzy ludzie i zdają się na swojej robocie, a to co sugerujesz byłoby breaking change.

  2. Nigdy nie powinnismy polegac na prywatnych polach – one zawsze maja prawo zmienic sie. Publiczny interfejs zatem nie powinien zmieniac sie.

Leave a Reply

Your email address will not be published.