Dictionary serialization
От: pva  
Дата: 30.09.09 20:29
Оценка:
Привет,

есть проблема: сериализация 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();
        }
newbie
dictionary serialization issue
Re: Dictionary serialization
От: AlexZu Россия  
Дата: 30.09.09 21:59
Оценка: 4 (1)
Здравствуйте, pva, Вы писали:

pva>есть проблема: сериализация Dictionary<T,K> проходит нормально, а десериализироваться не хочет. Ошибок нет, но и элементов тоже нет.

pva>Тестовый код приведен ниже. Подскажите где хоть искать причины.

Результат десериализации нигд ене используется (см. выделенное)

pva>
pva>        private void button1_Click(object sender, EventArgs e)
pva>        {
pva>            B.Instance["A"].Value = "A1";
pva>            B.Instance["B"].Value = "A2";

pva>            Stream lStream = File.Open("test.bin", FileMode.Create, FileAccess.ReadWrite);
pva>            BinaryFormatter lFormatter = new BinaryFormatter();
pva>            lFormatter.Serialize(lStream, B.Instance);

pva>            B.Instance.Reset();
pva>            lStream.Position = 0;
pva>            lFormatter.Deserialize(lStream);
pva>            lStream.Close();
pva>        }
pva>
Re[2]: Dictionary serialization
От: pva  
Дата: 01.10.09 07:00
Оценка:
Здравствуйте, AlexZu, Вы писали:

AZ>Результат десериализации нигд ене используется (см. выделенное)

1. Не совсем понятно каким образом присвоить синглтону результат
2. Если брякнуться внутри десериализатора класса B, то видно что info не содержит данных для Dictionary.

pva>>
pva>>        private void button1_Click(object sender, EventArgs e)
pva>>        {
pva>>            B.Instance["A"].Value = "A1";
pva>>            B.Instance["B"].Value = "A2";

pva>>            Stream lStream = File.Open("test.bin", FileMode.Create, FileAccess.ReadWrite);
pva>>            BinaryFormatter lFormatter = new BinaryFormatter();
pva>>            lFormatter.Serialize(lStream, B.Instance);

pva>>            B.Instance.Reset();
pva>>            lStream.Position = 0;
pva>>            lFormatter.Deserialize(lStream);
pva>>            lStream.Close();
pva>>        }
pva>>
newbie
Re[2]: Dictionary serialization
От: pva  
Дата: 01.10.09 07:09
Оценка:
Здравствуйте, AlexZu, Вы писали:

AZ>Результат десериализации нигд ене используется (см. выделенное)

Оказывается, несмотря на то что в отладке не видно десериализованного dictionary результат lFormatter.Deserialization таки содержит его. Ну что ж. Осталось изменить design.
newbie
Re[3]: Dictionary serialization
От: AlexZu Россия  
Дата: 01.10.09 07:19
Оценка:
Здравствуйте, pva, Вы писали:

pva>Здравствуйте, AlexZu, Вы писали:


AZ>>Результат десериализации нигд ене используется (см. выделенное)

pva>Оказывается, несмотря на то что в отладке не видно десериализованного dictionary результат lFormatter.Deserialization таки содержит его. Ну что ж. Осталось изменить design.

Dictionary<> реализует IDeserializationCallback, поэтому его окончательная десериализация (инициализация полей) происходит после десериализации всего графа.
Re[4]: Dictionary serialization
От: pva  
Дата: 01.10.09 07:30
Оценка:
Здравствуйте, AlexZu, Вы писали:

AZ>Dictionary<> реализует IDeserializationCallback, поэтому его окончательная десериализация (инициализация полей) происходит после десериализации всего графа.

Это я видел. В колбеке тоже поля не инициализированы еще. По крайней мере, в отладке Dictionary<>.Count == 0
newbie
Re[5]: Dictionary serialization
От: AlexZu Россия  
Дата: 01.10.09 07:48
Оценка:
Здравствуйте, pva, Вы писали:

pva>Здравствуйте, AlexZu, Вы писали:


AZ>>Dictionary<> реализует IDeserializationCallback, поэтому его окончательная десериализация (инициализация полей) происходит после десериализации всего графа.

pva>Это я видел. В колбеке тоже поля не инициализированы еще. По крайней мере, в отладке Dictionary<>.Count == 0

Вы наверное не том колбэке ведете речь, я имею ввиду IDeserializationCallback, в методе OnDeserialization которого происходит окончательная инициализация словаря.
Re[6]: Dictionary serialization
От: pva  
Дата: 01.10.09 07:52
Оценка:
Здравствуйте, AlexZu, Вы писали:

AZ>Вы наверное не том колбэке ведете речь, я имею ввиду IDeserializationCallback, в методе OnDeserialization которого происходит окончательная инициализация словаря.

Думаю, что о том.
        [OnDeserialized]
        public void OnDeserialization(StreamingContext context)
        {
            ...
        }
newbie
Re[7]: Dictionary serialization
От: AlexZu Россия  
Дата: 01.10.09 08:05
Оценка:
Здравствуйте, pva, Вы писали:

pva>Здравствуйте, AlexZu, Вы писали:


AZ>>Вы наверное не том колбэке ведете речь, я имею ввиду IDeserializationCallback, в методе OnDeserialization которого происходит окончательная инициализация словаря.

pva>Думаю, что о том.
pva>
        [OnDeserialized]
pva>        public void OnDeserialization(StreamingContext context)
pva>        {
pva>            ...
pva>        }
pva>


Ага, в первончальном коде просто не было такой штуки
Ну значит ваш OnDeserialization вызывается до Dictionary<>.OnDeserialization, тут уж кто первый, того и тапки...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.