2016-11-22 3 views
1

Ich habe eine Frage über das OnDeserializing Attribut. Ich habe eine Klasse:Was passiert mit einem Objekt während der Deserialisierung?

[Serializable] 
public class Test 
{ 
    int tmp = 10; 

    [OnDeserializing] 
    internal void OnDeserializingMethod(StreamingContext context) 
    { 
     tmp -= 3; 
     Console.WriteLine("{0}", tmp); 
    } 
} 

Serialisierung funktioniert perfekt in Ordnung, aber den Code in dem OnDeserializationMethod prints "-3".

Kann mir jemand sagen, warum das passiert?

Antwort

0

Der Punkt ist, dass bei der Deserialisierung Ihr Konstruktor nicht ausgeführt wird.

Sie sehen, diesen Code:

public class Foo 
{ 
    int test = 10; 
} 

Eigentlich dazu zusammengestellt wird:

public class Foo 
{ 
    int test; 

    public Foo() 
    { 
     test = 10; 
    } 
} 

Aber da das Konstruktor wird nicht ausgeführt, alle Membervariablen beginnen mit ihrem Standardwert aus, in Der Fall von int test ist 0.

So ruft dann der Deserializer OnDeserializingMethod() auf, und test wird um 3 dekrementiert, was 0 - 3 = -3 ergibt.

0

Das passiert, weil Sie einen Standardwert für das serialisierte Feld festlegen und somit das Feld tmp auf -3 gesetzt wird. Per Documentation on OnDeserializingAttribute

die OnDeserializingAttribute Verwenden Sie Standardwerte während Deserialisierung einzustellen. Wenn beispielsweise der Typ, den Sie deserialisieren, keinen Konstruktor enthält, erstellen Sie eine Methode zum Festlegen von Werten aller -Felder in der Instanz, und wenden Sie das Attribut auf die Methode an.

Verwandte Themen