Ich stieß auf ein, mindestens zu meinen Erwartungen, seltsames Verhalten in der binären Serialisierung von .NET.Merkwürdiges Verhalten der .NET-Binärserialisierung auf Wörterbuch <Key, Value>
Alle Elemente eines Dictionary
, die geladen werden, werden nach der Rückruffunktion OnDeserialization
zu ihrem übergeordneten Element hinzugefügt. Im Gegensatz dazu List
ist der andere Weg. Dies kann im reellen Repository-Code wirklich störend sein, wenn Sie zum Beispiel einige Delegaten zu Wörterbuchelementen hinzufügen müssen. Bitte überprüfe den Beispielcode und beobachte die Behauptungen.
Ist es normales Verhalten?
[Serializable]
public class Data : IDeserializationCallback
{
public List<string> List { get; set; }
public Dictionary<string, string> Dictionary { get; set; }
public Data()
{
Dictionary = new Dictionary<string, string> { { "hello", "hello" }, { "CU", "CU" } };
List = new List<string> { "hello", "CU" };
}
public static Data Load(string filename)
{
using (Stream stream = File.OpenRead(filename))
{
Data result = (Data)new BinaryFormatter().Deserialize(stream);
TestsLengthsOfDataStructures(result);
return result;
}
}
public void Save(string fileName)
{
using (Stream stream = File.Create(fileName))
{
new BinaryFormatter().Serialize(stream, this);
}
}
public void OnDeserialization(object sender)
{
TestsLengthsOfDataStructures(this);
}
private static void TestsLengthsOfDataStructures(Data data)
{
Debug.Assert(data.List.Count == 2, "List");
Debug.Assert(data.Dictionary.Count == 2, "Dictionary");
}
}
Ich finde es schwer, die Antworten zu folgen, weil Ihre Objektinstanz hat denselben Namen wie die Klasse! Wie können Sie zwischen statischen und Member-Methoden unterscheiden? –