ISerialization构造函数未被调用

时间:2009-03-02 13:19:11

标签: .net serialization

编辑:我的问题的解决方案是实现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>");

我认为会调用我的Serialization构造函数,但问题是永远不会被调用。

我正在使用上面发布的XML而不是这个

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

因为我从另一个应用程序发布了xml,所以我需要手动创建子对象并从构造函数中手动分配它的值。

我非常感谢您能为我提供的所有帮助和指导。

3 个答案:

答案 0 :(得分:7)

要自定义XML序列化,我认为您需要使用IXmlSerializable而不是ISerializable

我认为这需要一个无参数的构造函数,然后您需要实现ReadXmlWriteXml。换句话说,它不使用与二进制序列化相同的构造函数。

答案 1 :(得分:3)

您使用的序列化程序变量是什么?如果它是XmlSerializer,则不会调用序列化挂钩,因为XmlSerializer不支持它们(请参阅IXmlSerializable)。

答案 2 :(得分:2)

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;
        }