调用 XmlSerializer.Deserialize 注意:会一直增加程序集。

    技术2022-05-11  64

    当使用XmlSerializer(Type type,Type[] extraTypes)构造函数时:

    调用Deserialize会使 应用程序域的程序集不断增加。

     

    using  System; using  System.Collections.Generic; using  System.Text; using  System.Xml.Serialization; using  System.IO; using  System.Reflection; using  System.Collections; namespace  ConsoleApplication1 {    public class Class1    {        [XmlArrayItem(typeof(MyStruct))]        public ArrayList list = new ArrayList();        public void SaveAsXML(Stream s)        {            XmlSerializer sr = new XmlSerializer(this.GetType());            sr.Serialize(s, this);        }        //多次调用没有增加程序集        public static Class1 Deserialize1(Stream s)        {            XmlSerializer sr = new XmlSerializer(typeof(Class1));            return (Class1)sr.Deserialize(s);        }        //多次调用增加了程序集        public static Class1 Deserialize2(Stream s)        {            XmlSerializer sr = new XmlSerializer(typeof(Class1), new Type[] typeof(MyStruct) });            return (Class1)sr.Deserialize(s);        }        public static void Main()        {            Assembly[] assAry = System.AppDomain.CurrentDomain.GetAssemblies();            Console.WriteLine( "System assembly count:" + assAry.Length );            Class1 c = new Class1();            c.list.Add(new MyStruct()) ;            c.list.Add(new MyStruct());            MemoryStream ms = new System.IO.MemoryStream();            c.SaveAsXML(ms);                      for (int i = 0; i < 10; i++)            {                ms.Position = 0;                c = Class1.Deserialize1(ms);            }            assAry = System.AppDomain.CurrentDomain.GetAssemblies();            Console.WriteLine( "After Deserialize1 count:" + assAry.Length);            Console.WriteLine("====================================================");            for (int i = 0; i < assAry.Length; i++)            {                Console.WriteLine(assAry[i].FullName.Split(',')[0]);            }            for (int i = 0; i < 10; i++)            {                ms.Position = 0;                c = Class1.Deserialize2(ms);            }                        assAry = System.AppDomain.CurrentDomain.GetAssemblies();            Console.WriteLine("====================================================");            Console.WriteLine("After Deserialize2 count:" + assAry.Length);            for (int i = 0; i < assAry.Length; i++)            {                Console.WriteLine(assAry[i].FullName.Split(',')[0]);            }        }            }    public class MyStruct    {        public string name;        public int count;    }}

    输出:

    System assembly count:4After Deserialize1 count:6====================================================mscorlibConsoleApplication1System.XmlSystemSystem.Configurationfnti6agi====================================================After Deserialize2 count:16mscorlibConsoleApplication1System.XmlSystemSystem.Configurationfnti6agiifxcgktsyxwhgzrwqvh_acbjvr_plfcxgl9akgfiwsq5_vqc9gyztvh4y-29mn35ltvgbal01xkjfbpn请按任意键继续. . .

     


    最新回复(0)