ISerializable.GetObjectData(SerializationInfo, StreamingContext) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Заполняет объект SerializationInfo данными, необходимыми для сериализации целевого объекта.
public:
void GetObjectData(System::Runtime::Serialization::SerializationInfo ^ info, System::Runtime::Serialization::StreamingContext context);
public void GetObjectData (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context);
[System.Security.SecurityCritical]
public void GetObjectData (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context);
abstract member GetObjectData : System.Runtime.Serialization.SerializationInfo * System.Runtime.Serialization.StreamingContext -> unit
[<System.Security.SecurityCritical>]
abstract member GetObjectData : System.Runtime.Serialization.SerializationInfo * System.Runtime.Serialization.StreamingContext -> unit
Public Sub GetObjectData (info As SerializationInfo, context As StreamingContext)
Параметры
- info
- SerializationInfo
Объект SerializationInfo для заполнения данными.
- context
- StreamingContext
Конечный объект (см. StreamingContext) для этой сериализации.
- Атрибуты
Исключения
У вызывающего объекта отсутствует необходимое разрешение.
Примеры
В следующем примере метод используется GetObjectData для задания альтернативных значений сериализованного объекта. Код использует AddValue метод SerializationInfo класса для хранения альтернативных значений при сериализации объекта. И наоборот, когда конструктор Person
класса вызывается во время десериализации, переменные значения извлекаются с помощью GetValue метода и переназначаются полям объекта.
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
namespace ISerializableExample
{
class Program
{
public static void Main()
{
try
{
Run();
}
catch (Exception exc)
{
Console.WriteLine("{0}: {1}", exc.Message, exc.StackTrace);
}
finally
{
Console.WriteLine("Press Enter to exit....");
Console.ReadLine();
}
}
static void Run()
{
BinaryFormatter binaryFmt = new BinaryFormatter();
Person p = new Person();
p.IdNumber = 1010;
p.Name = "AAAAA";
FileStream fs = new FileStream
("Person.xml", FileMode.OpenOrCreate);
binaryFmt.Serialize(fs, p);
fs.Close();
Console.WriteLine
("Original Name: {0}, Original ID: {1}", p.Name, p.IdNumber);
// Deserialize.
fs = new FileStream
("Person.xml", FileMode.OpenOrCreate);
Person p2 = (Person)binaryFmt.Deserialize(fs);
Console.WriteLine("New Name: {0}, New ID: {1}", p2.Name, p2.IdNumber);
fs.Close();
}
}
[Serializable]
public class Person : ISerializable
{
private string name_value;
private int ID_value;
public Person() { }
protected Person(SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new System.ArgumentNullException("info");
name_value = (string)info.GetValue("AltName", typeof(string));
ID_value = (int)info.GetValue("AltID", typeof(int));
}
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new System.ArgumentNullException("info");
info.AddValue("AltName", "XXX");
info.AddValue("AltID", 9999);
}
public string Name
{
get { return name_value; }
set { name_value = value; }
}
public int IdNumber
{
get { return ID_value; }
set { ID_value = value; }
}
}
}
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Imports System.IO
<Assembly: SecurityPermission _
(SecurityAction.RequestMinimum, Execution:=True)>
Class Program
Public Shared Sub Main()
Try
Run()
Catch exc As Exception
Console.WriteLine("{0}: {1}", exc.Message, exc.StackTrace)
Finally
Console.WriteLine("Press Enter to exit....")
Console.ReadLine()
End Try
End Sub
Shared Sub Run()
Dim binaryFmt As New BinaryFormatter()
Dim p As New Person()
p.IdNumber = 1010
p.Name = "AAAAA"
Dim fs As New FileStream("Person.xml", FileMode.OpenOrCreate)
binaryFmt.Serialize(fs, p)
fs.Close()
Console.WriteLine _
("Original Name: {0}, Original ID: {1}", p.Name, p.IdNumber)
' Deserialize.
fs = New FileStream("Person.xml", FileMode.OpenOrCreate)
Dim p2 As Person = CType(binaryFmt.Deserialize(fs), Person)
Console.WriteLine("New Name: {0}, New ID: {1}", _
p2.Name, p2.IdNumber)
fs.Close()
End Sub
End Class
<Serializable()> _
Public Class Person
Implements ISerializable
Private name_value As String
Private ID_value As Integer
Public Sub New()
End Sub
Protected Sub New(ByVal info As SerializationInfo, _
ByVal context As StreamingContext)
If info Is Nothing Then
Throw New System.ArgumentNullException("info")
End If
name_value = CStr(info.GetValue("AltName", GetType(String)))
ID_value = Fix(info.GetValue("AltID", GetType(Integer)))
End Sub
<SecurityPermission(SecurityAction.LinkDemand, _
Flags:=SecurityPermissionFlag.SerializationFormatter)> _
Public Overridable Sub GetObjectData _
(ByVal info As SerializationInfo, _
ByVal context As StreamingContext) _
Implements ISerializable.GetObjectData
If info Is Nothing Then
Throw New System.ArgumentNullException("info")
End If
info.AddValue("AltName", "XXX")
info.AddValue("AltID", 9999)
End Sub
Public Property Name() As String
Get
Return name_value
End Get
Set(ByVal value As String)
name_value = value
End Set
End Property
Public Property IdNumber() As Integer
Get
Return ID_value
End Get
Set(ByVal value As Integer)
ID_value = value
End Set
End Property
End Class
Комментарии
Все объекты, включенные в SerializationInfo него, автоматически отслеживаются и сериализуются модульом форматирования.
Примечание
Не гарантируется, что этот метод будет вызываться только один раз на экземпляр объекта во время сериализации. Поэтому метод должен быть реализован таким образом, чтобы его поведение было одинаковым независимо от количества вызовов.