есть проблема: сериализация Dictionary<T,K> проходит нормально, а десериализироваться не хочет. Ошибок нет, но и элементов тоже нет.
Тестовый код приведен ниже. Подскажите где хоть искать причины.
[Serializable]
public class A : ISerializable
{
public string Value;
public A(string Value)
{
this.Value = Value;
}
protected A(SerializationInfo info, StreamingContext context)
{
Value = info.GetString("Value");
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Value", Value);
}
}
[Serializable]
public class B : ISerializable
{
#region Singleton
private static volatile B Instance_;
private static object Sync_ = new Object();
private B() {}
public static B Instance
{
get
{
if (Instance_ == null)
{
lock (Sync_)
{
if (Instance_ == null)
Instance_ = new B();
}
}
return Instance_;
}
}
#endregion
Dictionary<string, A> A_ = new Dictionary<string, A>();
public A this[string Name]
{
get
{
if (!A_.ContainsKey(Name))
{
A_.Add(Name, new A(Name));
}
return A_[Name];
}
}
public void Reset()
{
A_.Clear();
}
protected B(SerializationInfo info, StreamingContext context)
{
object lValue = info.GetValue("A", A_.GetType());
if (lValue.GetType() == A_.GetType())
{
A_ = (Dictionary<string, A>)lValue;
}
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("A", A_);
}
}
private void button1_Click(object sender, EventArgs e)
{
B.Instance["A"].Value = "A1";
B.Instance["B"].Value = "A2";
Stream lStream = File.Open("test.bin", FileMode.Create, FileAccess.ReadWrite);
BinaryFormatter lFormatter = new BinaryFormatter();
lFormatter.Serialize(lStream, B.Instance);
B.Instance.Reset();
lStream.Position = 0;
lFormatter.Deserialize(lStream);
lStream.Close();
}
Здравствуйте, pva, Вы писали:
pva>есть проблема: сериализация Dictionary<T,K> проходит нормально, а десериализироваться не хочет. Ошибок нет, но и элементов тоже нет. pva>Тестовый код приведен ниже. Подскажите где хоть искать причины.
Результат десериализации нигд ене используется (см. выделенное)
pva>
Здравствуйте, AlexZu, Вы писали:
AZ>Результат десериализации нигд ене используется (см. выделенное)
1. Не совсем понятно каким образом присвоить синглтону результат
2. Если брякнуться внутри десериализатора класса B, то видно что info не содержит данных для Dictionary.
pva>>
Здравствуйте, AlexZu, Вы писали:
AZ>Результат десериализации нигд ене используется (см. выделенное)
Оказывается, несмотря на то что в отладке не видно десериализованного dictionary результат lFormatter.Deserialization таки содержит его. Ну что ж. Осталось изменить design.
Здравствуйте, pva, Вы писали:
pva>Здравствуйте, AlexZu, Вы писали:
AZ>>Результат десериализации нигд ене используется (см. выделенное) pva>Оказывается, несмотря на то что в отладке не видно десериализованного dictionary результат lFormatter.Deserialization таки содержит его. Ну что ж. Осталось изменить design.
Dictionary<> реализует IDeserializationCallback, поэтому его окончательная десериализация (инициализация полей) происходит после десериализации всего графа.
Здравствуйте, AlexZu, Вы писали:
AZ>Dictionary<> реализует IDeserializationCallback, поэтому его окончательная десериализация (инициализация полей) происходит после десериализации всего графа.
Это я видел. В колбеке тоже поля не инициализированы еще. По крайней мере, в отладке Dictionary<>.Count == 0
Здравствуйте, pva, Вы писали:
pva>Здравствуйте, AlexZu, Вы писали:
AZ>>Dictionary<> реализует IDeserializationCallback, поэтому его окончательная десериализация (инициализация полей) происходит после десериализации всего графа. pva>Это я видел. В колбеке тоже поля не инициализированы еще. По крайней мере, в отладке Dictionary<>.Count == 0
Здравствуйте, AlexZu, Вы писали:
AZ>Вы наверное не том колбэке ведете речь, я имею ввиду IDeserializationCallback, в методе OnDeserialization которого происходит окончательная инициализация словаря.
Думаю, что о том.
[OnDeserialized]
public void OnDeserialization(StreamingContext context)
{
...
}
Здравствуйте, pva, Вы писали:
pva>Здравствуйте, AlexZu, Вы писали:
AZ>>Вы наверное не том колбэке ведете речь, я имею ввиду IDeserializationCallback, в методе OnDeserialization которого происходит окончательная инициализация словаря. pva>Думаю, что о том. pva>
Ага, в первончальном коде просто не было такой штуки
Ну значит ваш OnDeserialization вызывается доDictionary<>.OnDeserialization, тут уж кто первый, того и тапки...