Поделиться через


NetDataContractSerializer Класс

Определение

Сериализует и десериализует экземпляр типа в XML-поток или документ с помощью типов, предоставляемых .NET Framework. Этот класс не наследуется.

public ref class NetDataContractSerializer sealed : System::Runtime::Serialization::XmlObjectSerializer, System::Runtime::Serialization::IFormatter
public sealed class NetDataContractSerializer : System.Runtime.Serialization.XmlObjectSerializer, System.Runtime.Serialization.IFormatter
type NetDataContractSerializer = class
    inherit XmlObjectSerializer
    interface IFormatter
Public NotInheritable Class NetDataContractSerializer
Inherits XmlObjectSerializer
Implements IFormatter
Наследование
NetDataContractSerializer
Реализации

Примеры

В следующем примере показана сериализация типа Person с помощью NetDataContractSerializer. Атрибут DataContractAttribute применяется к классу, а атрибут DataMemberAttribute применяется к членам класса (включая закрытые члены), чтобы указать NetDataContractSerializer, какие элементы сериализовать.

// You must apply a DataContractAttribute or SerializableAttribute
// to a class to have it serialized by the NetDataContractSerializer.
[DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
class Person : IExtensibleDataObject
{
    [DataMember()]
    public string FirstName;
    [DataMember]
    public string LastName;
    [DataMember()]
    public int ID;

    public Person(string newfName, string newLName, int newID)
    {
        FirstName = newfName;
        LastName = newLName;
        ID = newID;
    }

    private ExtensionDataObject extensionData_Value;

    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionData_Value;
        }
        set
        {
            extensionData_Value = value;
        }
    }
}

public sealed class Test
{
    private Test() { }

    public static void Main()
    {
        try
        {
            WriteObject("NetDataContractSerializerExample.xml");
            ReadObject("NetDataContractSerializerExample.xml");
        }

        catch (SerializationException serExc)
        {
            Console.WriteLine("Serialization Failed");
            Console.WriteLine(serExc.Message);
        }
        catch (Exception exc)
        {
            Console.WriteLine(
            "The serialization operation failed: {0} StackTrace: {1}",
            exc.Message, exc.StackTrace);
        }

        finally
        {
            Console.WriteLine("Press <Enter> to exit....");
            Console.ReadLine();
        }
    }

    public static void WriteObject(string fileName)
    {
        Console.WriteLine(
            "Creating a Person object and serializing it.");
        Person p1 = new Person("Zighetti", "Barbara", 101);
        FileStream fs = new FileStream(fileName, FileMode.Create);
        XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
        NetDataContractSerializer ser =
            new NetDataContractSerializer();
        ser.WriteObject(writer, p1);
        writer.Close();
    }

    public static void ReadObject(string fileName)
    {
        Console.WriteLine("Deserializing an instance of the object.");
        FileStream fs = new FileStream(fileName,
        FileMode.Open);
        XmlDictionaryReader reader =
            XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        NetDataContractSerializer ser = new NetDataContractSerializer();

        // Deserialize the data and read it from the instance.
        Person deserializedPerson =
            (Person)ser.ReadObject(reader, true);
        fs.Close();
        Console.WriteLine(String.Format("{0} {1}, ID: {2}",
        deserializedPerson.FirstName, deserializedPerson.LastName,
        deserializedPerson.ID));
    }
}
' You must apply a DataContractAttribute or SerializableAttribute
' to a class to have it serialized by the NetDataContractSerializer.
<DataContract(Name := "Customer", [Namespace] := "http://www.contoso.com")>  _
Class Person
    Implements IExtensibleDataObject
    <DataMember()>  _
    Public FirstName As String
    <DataMember()>  _
    Public LastName As String
    <DataMember()>  _
    Public ID As Integer
    
    
    Public Sub New(ByVal newfName As String, ByVal newLName As String, _
       ByVal newID As Integer) 
        FirstName = newfName
        LastName = newLName
        ID = newID
    
    End Sub 
    
    Private extensionData_Value As ExtensionDataObject
    
    
    Public Property ExtensionData() As ExtensionDataObject _
     Implements IExtensibleDataObject.ExtensionData
        Get
            Return extensionData_Value
        End Get
        Set
            extensionData_Value = value
        End Set
    End Property
End Class 


NotInheritable Public Class Test

    Private Sub New() 
    
    End Sub
     
    Public Shared Sub Main() 
        Try
            WriteObject("NetDataContractSerializerExample.xml")
            ReadObject("NetDataContractSerializerExample.xml")
        
        Catch serExc As SerializationException
            Console.WriteLine("Serialization Failed")
            Console.WriteLine(serExc.Message)
        Catch exc As Exception
            Console.WriteLine("The serialization operation failed: {0} StackTrace: {1}", exc.Message, exc.StackTrace)
        
        Finally
            Console.WriteLine("Press <Enter> to exit....")
            Console.ReadLine()
        End Try
    
    End Sub 
    
    
    Public Shared Sub WriteObject(ByVal fileName As String) 
        Console.WriteLine("Creating a Person object and serializing it.")
        Dim p1 As New Person("Zighetti", "Barbara", 101)
        Dim fs As New FileStream(fileName, FileMode.Create)
        Dim writer As XmlDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(fs)
        Dim ser As New System.Runtime.Serialization.NetDataContractSerializer()

        ser.WriteObject(writer, p1)
        writer.Close()
    
    End Sub     

    Public Shared Sub ReadObject(ByVal fileName As String) 
        Console.WriteLine("Deserializing an instance of the object.")
        Dim fs As New FileStream(fileName, FileMode.Open)
        Dim reader As XmlDictionaryReader = _
           XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())
        Dim ser As New System.Runtime.Serialization.NetDataContractSerializer()
        
        ' Deserialize the data and read it from the instance.
        Dim deserializedPerson As Person = CType(ser.ReadObject(reader, True), Person)
        fs.Close()
        Console.WriteLine(String.Format("{0} {1}, ID: {2}", deserializedPerson.FirstName, deserializedPerson.LastName, deserializedPerson.ID))
    
    End Sub 
End Class

Комментарии

Безопасность

NetDataContractSerializer небезопасно. Дополнительные сведения см. в статье Руководство по безопасности BinaryFormatter.

Существует одно важное отличие NetDataContractSerializer от DataContractSerializer: NetDataContractSerializer включает информацию о типе CLR в сериализованный XML, а DataContractSerializer этого не делает. Таким образом NetDataContractSerializer может использоваться только при использовании одних и тех же типов CLR на концах сериализации.

Сериализатор может сериализовать типы, к которым применялся атрибут DataContractAttribute или атрибут SerializableAttribute. Он также сериализует типы, реализующие ISerializable.

Дополнительные сведения о сериализации см. в разделе Сериализация и десериализация.

Несовместимость с XElement

Класс XElement используется для записи XML. Однако NetDataContractSerializer не может сериализовать экземпляр этого типа. Поэтому следующий код завершается ошибкой с исключением: "Корневой тип "System.Xml. NetDataContractSerializer не поддерживает Linq.XElement на верхнем уровне, так как он является IXmlSerializable с IsAny=true и должен записывать все его содержимое, включая корневой элемент".

FileStream fs = new FileStream("mystuff.xml", FileMode.Create, FileAccess.ReadWrite);
XElement myElement = new XElement("Parent", new XElement("child1", "form"),
    new XElement("child2", "base"),
    new XElement("child3", "formbase")
    );
NetDataContractSerializer dcs = new NetDataContractSerializer();
dcs.WriteObject(fs, myElement);
Dim fs As New FileStream("mystuff.xml", FileMode.Create, FileAccess.ReadWrite)
Dim myElement As New XElement("Parent", New XElement("child1", "form"), _
    New XElement("child2", "base"), _
    New XElement("child3", "formbase") _
    )
Dim ser As New System.Runtime.Serialization. _
  NetDataContractSerializer()
ser.WriteObject(fs, myElement)

Однако если XElement используется в качестве типа поля или свойства класса, данные, содержащиеся в поле или свойстве, сериализуются. Это происходит потому, что данные являются членом класса и не являются верхним уровнем класса.

Конструкторы

NetDataContractSerializer()

Инициализирует новый экземпляр класса NetDataContractSerializer.

NetDataContractSerializer(StreamingContext)

Инициализирует новый экземпляр класса NetDataContractSerializer с переданными данными контекста потоковой передачи.

NetDataContractSerializer(StreamingContext, Int32, Boolean, FormatterAssemblyStyle, ISurrogateSelector)

Инициализирует новый экземпляр класса NetDataContractSerializer с предоставленными данными контекста; также задает максимальное количество сериализуемых элементов объекта и параметры, указывающие, пропускаются ли дополнительные данные, метод загрузки сборки и суррогатный селектор.

NetDataContractSerializer(String, String)

Инициализирует новый экземпляр класса NetDataContractSerializer с указанными корневыми элементом и пространством имен XML.

NetDataContractSerializer(String, String, StreamingContext, Int32, Boolean, FormatterAssemblyStyle, ISurrogateSelector)

Инициализирует новый экземпляр класса NetDataContractSerializer с предоставленными данными контекста, корневыми именем и пространством имен; также задает максимальное количество сериализуемых элементов объекта и параметры, указывающие, пропускаются ли дополнительные данные, метод загрузки сборки и суррогатный селектор.

NetDataContractSerializer(XmlDictionaryString, XmlDictionaryString)

Инициализирует новый экземпляр класса NetDataContractSerializer с двумя параметрами типа XmlDictionaryString, содержащими корневые элемент и пространство имен, используемые для задания содержимого.

NetDataContractSerializer(XmlDictionaryString, XmlDictionaryString, StreamingContext, Int32, Boolean, FormatterAssemblyStyle, ISurrogateSelector)

Инициализирует новый экземпляр класса NetDataContractSerializer с предоставленными данными контекста, корневыми именем и пространством имен (в качестве параметров XmlDictionaryString); также задает максимальное количество сериализуемых элементов объекта и параметры, указывающие, игнорируются ли дополнительные данные, метод загрузки сборки и суррогатный селектор.

Свойства

AssemblyFormat

Возвращает значение, задающее метод определения местоположения и загрузки сборок.

Binder

Возвращает или задает объект, управляющий загрузкой класса.

Context

Возвращает или задает объект, позволяющий передавать данные контекста, которые могут потребоваться при сериализации и десериализации.

IgnoreExtensionDataObject

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

MaxItemsInObjectGraph

Возвращает максимальное количество элементов, допустимое в сериализуемом объекте.

SurrogateSelector

Возвращает или задает объект, содействующий модулю форматирования при выборе суррогата для сериализации.

Методы

Deserialize(Stream)

Десериализует XML-документ или поток в объект.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
IsStartObject(XmlDictionaryReader)

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

IsStartObject(XmlReader)

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

MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ReadObject(Stream)

Считывает XML-поток или XML-документ с помощью средства чтения Stream и возвращает десериализованный объект.

(Унаследовано от XmlObjectSerializer)
ReadObject(XmlDictionaryReader)

Считывает XML-документ или XML-поток с помощью средства чтения XmlDictionaryReader и возвращает десериализованный объект.

(Унаследовано от XmlObjectSerializer)
ReadObject(XmlDictionaryReader, Boolean)

Считывает XML-поток или документ с помощью средства чтения XmlDictionaryReader и возвращает десериализованный объект; также проверяет, соответствуют ли данные объекта имени и пространству имен, используемым для создания сериализатора.

ReadObject(XmlReader)

Считывает XML-поток или документ с помощью средства чтения XmlDictionaryReader и возвращает десериализованный объект.

ReadObject(XmlReader, Boolean)

Считывает XML-поток или документ с помощью средства чтения XmlDictionaryReader и возвращает десериализованный объект; также проверяет, соответствуют ли данные объекта имени и пространству имен, используемым для создания сериализатора.

Serialize(Stream, Object)

Сериализует заданный граф объектов с помощью указанного модуля записи.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
WriteEndObject(XmlDictionaryWriter)

Выполняет запись закрывающего XML-элемента с помощью средства записи XmlDictionaryWriter.

WriteEndObject(XmlWriter)

Выполняет запись закрывающего XML-элемента с помощью средства записи XmlWriter.

WriteObject(Stream, Object)

Записывает полное содержимое объекта (начало записи, запись содержимого и завершение записи) в XML-документ или поток с помощью указанного средства записи Stream.

(Унаследовано от XmlObjectSerializer)
WriteObject(XmlDictionaryWriter, Object)

Записывает полное содержимое объекта (начало записи, запись содержимого и завершение записи) в XML-документ или поток с помощью указанного средства записи XmlDictionaryWriter.

(Унаследовано от XmlObjectSerializer)
WriteObject(XmlWriter, Object)

Записывает полное содержимое объекта (начало записи, запись содержимого и завершение записи) в XML-документ или поток с помощью указанного средства записи XmlWriter.

WriteObjectContent(XmlDictionaryWriter, Object)

Выполняет запись содержимого XML с помощью средства записи XmlDictionaryWriter.

WriteObjectContent(XmlWriter, Object)

Выполняет запись содержимого XML с помощью средства записи XmlWriter.

WriteStartObject(XmlDictionaryWriter, Object)

Выполняет запись открывающего XML-элемента с помощью модуля записи XmlDictionaryWriter.

WriteStartObject(XmlWriter, Object)

Выполняет запись открывающего XML-элемента с помощью модуля записи XmlWriter.

Применяется к

См. также раздел