程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [C#基礎]關於何時使用XmlSerializer的構造函數(Type, Type[])

[C#基礎]關於何時使用XmlSerializer的構造函數(Type, Type[])

編輯:C#入門知識

[C#基礎]關於何時使用XmlSerializer的構造函數(Type, Type[])


首先引用msdn上的內容,是關於XmlSerializer的構造函數(Type, Type[])的:

 

 

默認情況下,如果某公共屬性或字段返回對象或對象數組,則將自動序列化此對象類型。但是,如果某個類包含返回Object類型的數組的字段或屬性,則可以將任何對象插入此數組。在此情況下,必須指示 XmlSerializer,請求將要插入到 Object 數組的所有可能的對象類型。若要執行該操作,請使用 extraTypes 參數指定要序列化或反序列化的其他對象類型。

還可以使用 extraTypes 參數指定從基類派生的類型。例如,假設有一個名為 Phone 的基類,並且一個名為 InternationalPhone 的類從該基類派生。同時,使用 extraTypes參數來指定派生類型。

 

第一種使用的情況:

這裡給出測試代碼:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    public class A 
    {
        public string x = aaa;
    }

    public class B : A
    {
        public int i = 1;
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    public class UserInfo
    {
        public int userId;
        public string userName;
        public A a;
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            UserInfo info = new UserInfo() { userId = 1, userName = Guozhijian, a = new A() };
            string s;

            using (StringWriter sw = new StringWriter())
            {
                XmlSerializer xz = new XmlSerializer(info.GetType());
                xz.Serialize(sw, info);
                s = sw.ToString();
            }
            Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}

上面的代碼是可以成功運行的,但如果將Main函數的第一句改為:

 

 

UserInfo info = new UserInfo() { userId = 1, userName = Guozhijian, a = new B() };

則運行時會報錯,原因是因為UserInfo類包含了一個被轉化為派生類的基類,那麼這時就到了我們主角的出場了。

 

將Main函數修改如下:

 

static void Main(string[] args)
        {
            Type[] types = new Type[] { typeof(B)};
            UserInfo info = new UserInfo() { userId = 1, userName = Guozhijian, a = new B() };
            string s;

            using (StringWriter sw = new StringWriter())
            {
                XmlSerializer xz = new XmlSerializer(info.GetType(),types);
                xz.Serialize(sw, info);
                s = sw.ToString();
            }
            Console.WriteLine(s);
            Console.ReadLine();
        }

這樣又可以跑起來了!也就是說如果我們要序列化的類中,包含了一個被轉化為派生類的基類,那麼可以創建一個Type數組,把需要用到的派生類給它,然後再用(Type, Type[])的構造函數。

 

 

第二種使用的情況:

這裡給出測試代碼:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    public class UserInfo
    {
        public int userId;
        public string userName;
        public Object[] a;
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A();
            a1.x = a1;
            A a2 = new A();
            a2.x = a2;
            A[] aArray = new A[] { a1, a2 };
            UserInfo info = new UserInfo() { userId = 1, userName = Guozhijian, a = aArray };
            string s;

            using (StringWriter sw = new StringWriter())
            {
                XmlSerializer xz = new XmlSerializer(info.GetType());
                xz.Serialize(sw, info);
                s = sw.ToString();
            }
            Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}

這個是運行不了的,因為UserInfo類包含返回Object類型的數組的字段,並且我們將一個類A的數組賦值給了這個字段。那麼這時我們的主角又出場了。。

 

將Main函數修改如下:

 

static void Main(string[] args)
        {
            Type[] types = new Type[] { typeof(A)};
            A a1 = new A();
            a1.x = a1;
            A a2 = new A();
            a2.x = a2;
            A[] aArray = new A[] { a1, a2 };
            UserInfo info = new UserInfo() { userId = 1, userName = Guozhijian, a = aArray };
            string s;

            using (StringWriter sw = new StringWriter())
            {
                XmlSerializer xz = new XmlSerializer(info.GetType(),types);
                xz.Serialize(sw, info);
                s = sw.ToString();
            }
            Console.WriteLine(s);
            Console.ReadLine();
        }

這時我們的代碼又可以跑了!也就是說如果我們要序列化的類中,包含了返回Object類型的數組的字段或屬性,並且這個字段或屬性被其他類型賦值的話,那麼可以創建一個Type數組,把其他類型給它,然後再用(Type, Type[])的構造函數。

 

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved