共用方式為


XmlAttributeOverrides 類別

定義

允許你在使用 S XmlSerializer 來序列化或反序列化物件時,覆蓋屬性、欄位和類別屬性。

public ref class XmlAttributeOverrides
public class XmlAttributeOverrides
type XmlAttributeOverrides = class
Public Class XmlAttributeOverrides
繼承
XmlAttributeOverrides

範例

以下範例序列化一個名為 Orchestra的類別,該類別包含一個名為 Instruments 的欄位,該欄位回傳一個物件 Instrument 陣列。 第二類則 Brass 是繼承自該 Instrument 類。 範例使用類別 XmlAttributeOverrides 的實例來覆寫該 Instrument 欄位,使欄位能夠接受 Brass 物件。

using System;
using System.IO;
using System.Xml.Serialization;

public class Orchestra
{
   public Instrument[] Instruments;
}

public class Instrument
{
   public string Name;
}

public class Brass:Instrument
{
   public bool IsValved;
}

public class Run
{
    public static void Main()
    {
       Run test = new Run();
       test.SerializeObject("Override.xml");
       test.DeserializeObject("Override.xml");
    }

    public void SerializeObject(string filename)
    {
      /* Each overridden field, property, or type requires
      an XmlAttributes object. */
      XmlAttributes attrs = new XmlAttributes();

      /* Create an XmlElementAttribute to override the
      field that returns Instrument objects. The overridden field
      returns Brass objects instead. */
      XmlElementAttribute attr = new XmlElementAttribute();
      attr.ElementName = "Brass";
      attr.Type = typeof(Brass);

      // Add the element to the collection of elements.
      attrs.XmlElements.Add(attr);

      // Create the XmlAttributeOverrides object.
      XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();

      /* Add the type of the class that contains the overridden
      member and the XmlAttributes to override it with to the
      XmlAttributeOverrides object. */
      attrOverrides.Add(typeof(Orchestra), "Instruments", attrs);

      // Create the XmlSerializer using the XmlAttributeOverrides.
      XmlSerializer s =
      new XmlSerializer(typeof(Orchestra), attrOverrides);

      // Writing the file requires a TextWriter.
      TextWriter writer = new StreamWriter(filename);

      // Create the object that will be serialized.
      Orchestra band = new Orchestra();

      // Create an object of the derived type.
      Brass i = new Brass();
      i.Name = "Trumpet";
      i.IsValved = true;
      Instrument[] myInstruments = {i};
      band.Instruments = myInstruments;

      // Serialize the object.
      s.Serialize(writer,band);
      writer.Close();
   }

   public void DeserializeObject(string filename)
   {
      XmlAttributeOverrides attrOverrides =
         new XmlAttributeOverrides();
      XmlAttributes attrs = new XmlAttributes();

      // Create an XmlElementAttribute to override the Instrument.
      XmlElementAttribute attr = new XmlElementAttribute();
      attr.ElementName = "Brass";
      attr.Type = typeof(Brass);

      // Add the XmlElementAttribute to the collection of objects.
      attrs.XmlElements.Add(attr);

      attrOverrides.Add(typeof(Orchestra), "Instruments", attrs);

      // Create the XmlSerializer using the XmlAttributeOverrides.
      XmlSerializer s =
      new XmlSerializer(typeof(Orchestra), attrOverrides);

      FileStream fs = new FileStream(filename, FileMode.Open);
      Orchestra band = (Orchestra) s.Deserialize(fs);
      Console.WriteLine("Brass:");

      /* The difference between deserializing the overridden
      XML document and serializing it is this: To read the derived
      object values, you must declare an object of the derived type
      (Brass), and cast the Instrument instance to it. */
      Brass b;
      foreach(Instrument i in band.Instruments)
      {
         b = (Brass)i;
         Console.WriteLine(
         b.Name + "\n" +
         b.IsValved);
      }
   }
}
Option Explicit
Option Strict

Imports System.IO
Imports System.Xml.Serialization

Public Class Orchestra
    Public Instruments() As Instrument
End Class

Public Class Instrument
    Public Name As String
End Class

Public Class Brass
    Inherits Instrument
    Public IsValved As Boolean
End Class

Public Class Run
    
    Public Shared Sub Main()
        Dim test As New Run()
        test.SerializeObject("Override.xml")
        test.DeserializeObject("Override.xml")
    End Sub
        
    Public Sub SerializeObject(ByVal filename As String)
        ' Each overridden field, property, or type requires
        ' an XmlAttributes object. 
        Dim attrs As New XmlAttributes()
        
        ' Create an XmlElementAttribute to override the
        ' field that returns Instrument objects. The overridden field
        ' returns Brass objects instead. 
        Dim attr As New XmlElementAttribute()
        attr.ElementName = "Brass"
        attr.Type = GetType(Brass)
        
        ' Add the element to the collection of elements.
        attrs.XmlElements.Add(attr)
        
        ' Create the XmlAttributeOverrides object.
        Dim attrOverrides As New XmlAttributeOverrides()
        
        ' Add the type of the class that contains the overridden
        ' member and the XmlAttributes to override it with to the
        ' XmlAttributeOverrides object. 
        attrOverrides.Add(GetType(Orchestra), "Instruments", attrs)
        
        ' Create the XmlSerializer using the XmlAttributeOverrides.
        Dim s As New XmlSerializer(GetType(Orchestra), attrOverrides)
        
        ' Writing the file requires a TextWriter.
        Dim writer As New StreamWriter(filename)
        
        ' Create the object that will be serialized.
        Dim band As New Orchestra()
        
        ' Create an object of the derived type.
        Dim i As New Brass()
        i.Name = "Trumpet"
        i.IsValved = True
        Dim myInstruments() As Instrument = {i}
        band.Instruments = myInstruments
        
        ' Serialize the object.
        s.Serialize(writer, band)
        writer.Close()
    End Sub    
    
    Public Sub DeserializeObject(filename As String)
        Dim attrOverrides As New XmlAttributeOverrides()
        Dim attrs As New XmlAttributes()
        
        ' Create an XmlElementAttribute to override the Instrument.
        Dim attr As New XmlElementAttribute()
        attr.ElementName = "Brass"
        attr.Type = GetType(Brass)
        
        ' Add the XmlElementAttribute to the collection of objects.
        attrs.XmlElements.Add(attr)
        
        attrOverrides.Add(GetType(Orchestra), "Instruments", attrs)
        
        ' Create the XmlSerializer using the XmlAttributeOverrides.
        Dim s As New XmlSerializer(GetType(Orchestra), attrOverrides)
        
        Dim fs As New FileStream(filename, FileMode.Open)
        Dim band As Orchestra = CType(s.Deserialize(fs), Orchestra)
        Console.WriteLine("Brass:")
        
        ' The difference between deserializing the overridden
        ' XML document and serializing it is this: To read the derived
        ' object values, you must declare an object of the derived type
        ' (Brass), and cast the Instrument instance to it. 
        Dim b As Brass
        Dim i As Instrument
        For Each i In  band.Instruments
            b = CType(i, Brass)
            Console.WriteLine(b.Name & ControlChars.Cr & b.IsValved)
        Next i
    End Sub
End Class

備註

這使得 XmlAttributeOverrides 能夠 XmlSerializer 覆蓋預設的序列化一組物件的方式。 以這種方式覆寫序列化有兩個用途:首先,你可以控制並增強 DLL 中物件的序列化——即使你無法取得原始碼;第二,你可以建立一組可序列化的類別,但用多種方式序列化物件。 例如,你可以將類別實例的成員序列化為 XML 元素,而是序列化為 XML 屬性,從而使文件傳輸更有效率。

建立物件 XmlAttributeOverrides 後,你會把它作為參數傳給 XmlSerializer 建構子。 結果 XmlSerializer 是利用 所 XmlAttributeOverrides 包含的資料覆蓋控制物件序列化的屬性。 為達成此目的,包含 XmlAttributeOverrides 一組被覆寫的物件類型,以及 XmlAttributes 與每個覆寫物件類型相關的物件。 XmlAttributes物件本身包含一組適當的屬性物件,用以控制每個欄位、屬性或類別如何序列化。

建立與使用 XmlAttributeOverrides 物件的流程如下:

  1. 建立 XmlAttributes 物件。

  2. 建立一個適合被覆寫物件的屬性物件。 例如,若要覆寫欄位或屬性,請使用新的導出型別建立一個 XmlElementAttribute。 你可以選擇性地指派一個新的 ElementName,或 Namespace 是覆蓋基底類別屬性名稱或命名空間的 。

  3. 將屬性物件加入適當的 XmlAttributes 屬性或集合。 例如,你會將 加入XmlElementAttributeXmlElements物件集合XmlAttributes,指定被覆寫的成員名稱。

  4. 建立 XmlAttributeOverrides 物件。

  5. 使用該 Add 方法,將物件加入 XmlAttributes 物件 XmlAttributeOverrides 。 如果被覆寫的物件是 XmlRootAttributeXmlTypeAttribute,你只需指定被覆寫物件的類型即可。 但如果你要覆寫欄位或屬性,也必須指定被覆寫成員的名稱。

  6. 當構造 時XmlSerializer,將 傳給XmlAttributeOverridesXmlSerializer建構子。

  7. 利用結果 XmlSerializer 來序列化或反序列化衍生類別物件。

建構函式

名稱 Description
XmlAttributeOverrides()

初始化 XmlAttributeOverrides 類別的新執行個體。

屬性

名稱 Description
Item[Type, String]

取得與指定(基底類別)類型相關的物件。 成員參數指定被覆寫的基底類別成員。

Item[Type]

取得與指定基底類別型別相關聯的物件。

方法

名稱 Description
Add(Type, String, XmlAttributes)

將物件 XmlAttributes 加入物件集合 XmlAttributes 。 參數 type 指定要覆寫的物件。 參數 member 指定被覆寫的成員名稱。

Add(Type, XmlAttributes)

將物件 XmlAttributes 加入物件集合 XmlAttributes 。 參數 type 指定一個物件要被該 XmlAttributes 物件覆蓋。

Equals(Object)

判斷指定的物件是否等於目前的物件。

(繼承來源 Object)
GetHashCode()

做為預設哈希函式。

(繼承來源 Object)
GetType()

取得目前實例的 Type

(繼承來源 Object)
MemberwiseClone()

建立目前 Object的淺層複本。

(繼承來源 Object)
ToString()

傳回表示目前 物件的字串。

(繼承來源 Object)

適用於

另請參閱