ISerializable.GetObjectData(SerializationInfo, StreamingContext) Metodo
Definizione
Popola un oggetto SerializationInfo con i dati necessari per serializzare l'oggetto di destinazione.Populates a SerializationInfo with the data needed to serialize the target object.
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)
Parametri
- info
- SerializationInfo
Oggetto SerializationInfo da popolare con i dati.The SerializationInfo to populate with data.
- context
- StreamingContext
Destinazione della serializzazione (vedere StreamingContext).The destination (see StreamingContext) for this serialization.
- Attributi
Eccezioni
Il chiamante non dispone dell'autorizzazione richiesta.The caller does not have the required permission.
Esempio
Nell'esempio seguente viene utilizzato il GetObjectData metodo per impostare valori alternativi per un oggetto serializzato.The following example uses the GetObjectData method to set alternate values for a serialized object. Il codice usa il AddValue metodo della SerializationInfo classe per archiviare i valori alternativi quando l'oggetto viene serializzato.The code uses the AddValue method of the SerializationInfo class to store the alternate values when the object is serialized. Viceversa, quando il costruttore della Person
classe viene chiamato durante la deserializzazione, i valori alternativi vengono recuperati vengono recuperati utilizzando il GetValue metodo e riassegnati ai campi dell'oggetto.Conversely, when the constructor of the Person
class is called during deserialization, the alternatve values are retrieved using the GetValue method and reassigned to the object's fields.
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.IO;
[assembly: SecurityPermission(
SecurityAction.RequestMinimum, Execution = true)]
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));
}
[SecurityPermission(SecurityAction.LinkDemand,
Flags = SecurityPermissionFlag.SerializationFormatter)]
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
Commenti
Tutti gli oggetti inclusi in SerializationInfo vengono automaticamente rilevati e serializzati dal formattatore.Any objects that are included in the SerializationInfo are automatically tracked and serialized by the formatter.
Il codice che chiama GetObjectData richiede SecurityPermission per fornire i servizi di serializzazione.Code that calls GetObjectData requires the SecurityPermission for providing serialization services. Enumerazione associata: SecurityPermissionFlag.SerializationFormatter.Associated enumeration: SecurityPermissionFlag.SerializationFormatter.
Nota
Non è garantito che questo metodo venga chiamato una sola volta per ogni istanza dell'oggetto durante la serializzazione.It is not guaranteed that this method will be called only once per object instance during serialization. Pertanto, il metodo deve essere implementato in modo tale che il suo comportamento sarà lo stesso indipendentemente dal numero di volte in cui viene chiamato.Therefore, the method should be implemented in such a way that its behavior will be the same regardless of the number of times it is called.