Конструктор ISerialization не вызывается - PullRequest
1 голос
/ 02 марта 2009

РЕДАКТИРОВАТЬ: решение моей проблемы заключается в реализации IXMLSerializer. Спасибо всем за быстрый ответ.

Привет всем, у меня есть эта проблема, и я, кажется, не могу найти правильное решение для нее.

У меня есть следующий класс

public class Child
        {
            private int _id;

            public int Id
            {
                get { return _id; }
                set { _id = value; }
            }

        }
        [Serializable]
        public class Test: ISerializable
        {
            private int _id;

            public int Id
            {
                get { return _id; }
                set { _id = value; }
            }

            private Child _child = new Child();

            public Child Child
            {
                get { return _child; }
                set { _child = value; }
            }

            public Test()
            {
            }
            protected Test(SerializationInfo info, StreamingContext context)
            {
                if (info.MemberCount > 1)
                    Child.Id = info.GetInt32("ChildId");
            }


            #region ISerializable Members

            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                info.AddValue("ChildId", Child.Id);
            }

            #endregion
        }

Если я отправлю следующий XML для десериализации

<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><ChildId>10</ChildId></Test>

с использованием следующего кода для десериализации

serializer.Deserialize(new StringReader("<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><ChildId>10</ChildId></Test>");

Я предполагал, что это вызовет мой конструктор сериализации, но дело в том, что его никогда не вызывают.

Я использую приведенный выше XML вместо этого

<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><Child><Id>10</Id></Child></Test>

Поскольку я отправляю xml из другого приложения, мне нужно вручную создавать дочерние объекты и присваивать его значение вручную из конструктора.

Я буду очень признателен за всю помощь и руководство, которое вы можете оказать мне.

Ответы [ 3 ]

7 голосов
/ 02 марта 2009

Для настройки XML-сериализации я считаю, что вам нужно использовать IXmlSerializable вместо ISerializable.

Я думаю, что для этого требуется конструктор без параметров, и вам нужно реализовать ReadXml и WriteXml. Другими словами, он не использует тот же конструктор, что и двоичная сериализация.

3 голосов
/ 02 марта 2009

Какую переменную сериализатора вы используете? Если это XmlSerializer, ваши ловушки сериализации не будут вызываться, потому что XmlSerializer их не поддерживает (см. IXmlSerializable).

2 голосов
/ 02 марта 2009

XmlSerializer не использует SerializableAttribute, ISerializable и конструктор, принимающий информацию SerializationInfo и параметры StreamingContext. Эти конструкции используются при использовании SoapFormatter (устаревший) и BinaryFormatter для сериализации.

        BinaryFormatter bf = new BinaryFormatter();
        using (MemoryStream ms = new MemoryStream())
        {
            Class1 c1 = new Class1();
            bf.Serialize(ms, c1);

            ms.Position = 0;
            Class1 c2 = bf.Deserialize(ms) as Class1;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...