ISerializable.GetObjectData 方法
使用将目标对象序列化所需的数据填充 SerializationInfo。
**命名空间:**System.Runtime.Serialization
**程序集:**mscorlib(在 mscorlib.dll 中)
语法
声明
Sub GetObjectData ( _
info As SerializationInfo, _
context As StreamingContext _
)
用法
Dim instance As ISerializable
Dim info As SerializationInfo
Dim context As StreamingContext
instance.GetObjectData(info, context)
void GetObjectData (
SerializationInfo info,
StreamingContext context
)
void GetObjectData (
SerializationInfo^ info,
StreamingContext context
)
void GetObjectData (
SerializationInfo info,
StreamingContext context
)
function GetObjectData (
info : SerializationInfo,
context : StreamingContext
)
参数
- info
要填充数据的 SerializationInfo。
- context
此序列化的目标(请参见 StreamingContext)。
异常
异常类型 | 条件 |
---|---|
调用方没有所要求的权限。 |
备注
格式化程序会自动跟踪和序列化任何包含在 SerializationInfo 中的对象。
调用 GetObjectData 的代码需要 SecurityPermission 来提供序列化服务。关联的枚举:SecurityPermissionFlag.SerializationFormatter。
提示
不能保证在每个对象实例的序列化期间只调用一次该方法。因此,无论调用多少次,按这种方式实现的方法,其行为都应该相同。
示例
下面的示例使用 GetObjectData 方法设置序列化对象的替代值。该代码使用 SerializationInfo 类的 AddValue 方法在序列化对象时存储替代值。相反,在反序列化期间调用 Person
类的构造函数时,使用 GetValue 方法对替代值进行检索并将其重新赋给对象的字段。
Imports System
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
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; }
}
}
}
平台
Windows 98、Windows 2000 SP4、Windows Millennium Edition、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition
.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息
.NET Framework
受以下版本支持:2.0、1.1、1.0
请参见
参考
ISerializable 接口
ISerializable 成员
System.Runtime.Serialization 命名空间
StreamingContext
SerializationInfo