Exception.GetObjectData 方法
当在派生类中重写时,用关于异常的信息设置 SerializationInfo。
**命名空间:**System
**程序集:**mscorlib(在 mscorlib.dll 中)
语法
声明
Public Overridable Sub GetObjectData ( _
info As SerializationInfo, _
context As StreamingContext _
)
用法
Dim instance As Exception
Dim info As SerializationInfo
Dim context As StreamingContext
instance.GetObjectData(info, context)
public virtual void GetObjectData (
SerializationInfo info,
StreamingContext context
)
public:
virtual void GetObjectData (
SerializationInfo^ info,
StreamingContext context
)
public void GetObjectData (
SerializationInfo info,
StreamingContext context
)
public function GetObjectData (
info : SerializationInfo,
context : StreamingContext
)
参数
- info
SerializationInfo,它存有有关所引发异常的序列化的对象数据。
- context
StreamingContext,它包含有关源或目标的上下文信息。
异常
异常类型 | 条件 |
---|---|
info 参数是空引用(Visual Basic 中为 Nothing)。 |
备注
GetObjectData 用针对于序列化的所有异常对象数据设置 SerializationInfo。反序列化期间,从通过流传输的 SerializationInfo 重建异常。
示例
下面的代码示例定义一个派生的可序列化 Exception 类,该类实现了 GetObjectData,后者对两个属性做一些小的改动,然后调用基类以执行序列化。该示例强制产生一个被零除错误,然后创建派生异常的一个实例。代码将该实例序列化为一个文件,并将该文件反序列化为一个它引发的新异常,然后捕捉并显示该异常的数据。
' Example for the Exception( SerializationInfo, StreamingContext )
' constructor and the Exception.GetObjectData( SerializationInfo,
' StreamingContext ) method.
'
' If compiling with the Visual Basic compiler (VBC) from the command
' prompt, be sure to add the following switch:
' /reference:System.Runtime.Serialization.Formatters.Soap.dll
Imports System
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Soap
Imports Microsoft.VisualBasic
Imports System.Security.Permissions
Namespace NDP_UE_VB
' Define a serializable derived exception class.
<Serializable()> _
Class SecondLevelException
Inherits Exception
' This public constructor is used by class instantiators.
Public Sub New( message As String, inner As Exception )
MyBase.New( message, inner )
HelpLink = "https://MSDN.Microsoft.com"
Source = "Exception_Class_Samples"
End Sub ' New
' This protected constructor is used for deserialization.
Protected Sub New( info As SerializationInfo, _
context As StreamingContext )
MyBase.New( info, context )
End Sub ' New
' GetObjectData performs a custom serialization.
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter:=True)> _
Overrides Sub GetObjectData( info As SerializationInfo, _
context As StreamingContext)
' Change the case of two properties, and then use the
' method of the base class.
HelpLink = HelpLink.ToLower()
Source = Source.ToUpper()
MyBase.GetObjectData(info, context)
End Sub ' ISerializable.GetObjectData
End Class ' SecondLevelException
Module SerializationDemo
Sub Main()
Console.WriteLine( _
"This example of the Exception constructor " & _
"and Exception.GetObjectData " & vbCrLf & _
"with SerializationInfo and StreamingContext " & _
"parameters generates " & vbCrLf & _
"the following output." & vbCrLf )
' This code forces a division by 0 and catches the
' resulting exception.
Try
Try
Dim zero As Integer = 0
Dim ecks As Integer = 1 \ zero
' Create a new exception to throw again.
Catch ex As Exception
Dim newExcept As New SecondLevelException( _
"Forced a division by 0 and threw " & _
"another exception.", ex )
Console.WriteLine( _
"Forced a division by 0, caught the " & _
"resulting exception, " & vbCrLf & _
"and created a derived exception:" & vbCrLf )
Console.WriteLine( "HelpLink: {0}", _
newExcept.HelpLink )
Console.WriteLine( "Source: {0}", _
newExcept.Source )
' This FileStream is used for the serialization.
Dim stream As New FileStream( _
"NewException.dat", FileMode.Create )
' Serialize the derived exception.
Try
Dim formatter As New SoapFormatter( Nothing, _
New StreamingContext( _
StreamingContextStates.File ) )
formatter.Serialize( stream, newExcept )
' Rewind the stream and deserialize the
' exception.
stream.Position = 0
Dim deserExcept As SecondLevelException = _
CType( formatter.Deserialize( stream ), _
SecondLevelException )
Console.WriteLine( vbCrLf & _
"Serialized the exception, and then " & _
"deserialized the resulting stream " & _
"into a " & vbCrLf & "new exception. " & _
"The deserialization changed the case " & _
"of certain properties:" & vbCrLf )
' Throw the deserialized exception again.
Throw deserExcept
Catch se As SerializationException
Console.WriteLine( "Failed to serialize: {0}", _
se.ToString( ) )
Finally
stream.Close( )
End Try
End Try
Catch ex As Exception
Console.WriteLine( "HelpLink: {0}", ex.HelpLink )
Console.WriteLine( "Source: {0}", ex.Source )
Console.WriteLine( )
Console.WriteLine( ex.ToString( ) )
End Try
End Sub ' Main
End Module ' SerializationDemo
End Namespace ' NDP_UE_VB
' This example of the Exception constructor and Exception.GetObjectData
' with SerializationInfo and StreamingContext parameters generates
' the following output.
'
' Forced a division by 0, caught the resulting exception,
' and created a derived exception:
'
' HelpLink: https://MSDN.Microsoft.com
' Source: Exception_Class_Samples
'
' Serialized the exception, and then deserialized the resulting stream into a
' new exception. The deserialization changed the case of certain properties:
'
' HelpLink: https://msdn.microsoft.com
' Source: EXCEPTION_CLASS_SAMPLES
'
' NDP_UE_VB.SecondLevelException: Forced a division by 0 and threw another exce
' ption. ---> System.DivideByZeroException: Attempted to divide by zero.
' at NDP_UE_VB.SerializationDemo.Main()
' --- End of inner exception stack trace ---
' at NDP_UE_VB.SerializationDemo.Main()
// Example for the Exception( SerializationInfo, StreamingContext )
// constructor and the Exception.GetObjectData( SerializationInfo,
// StreamingContext ) method.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.Security.Permissions;
namespace NDP_UE_CS
{
// Define a serializable derived exception class.
[Serializable()]
class SecondLevelException : Exception, ISerializable
{
// This public constructor is used by class instantiators.
public SecondLevelException( string message, Exception inner ) :
base( message, inner )
{
HelpLink = "https://MSDN.Microsoft.com";
Source = "Exception_Class_Samples";
}
// This protected constructor is used for deserialization.
protected SecondLevelException( SerializationInfo info,
StreamingContext context ) :
base( info, context )
{ }
// GetObjectData performs a custom serialization.
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]
public override void GetObjectData( SerializationInfo info,
StreamingContext context )
{
// Change the case of two properties, and then use the
// method of the base class.
HelpLink = HelpLink.ToLower( );
Source = Source.ToUpper( );
base.GetObjectData( info, context );
}
}
class SerializationDemo
{
public static void Main()
{
Console.WriteLine(
"This example of the Exception constructor " +
"and Exception.GetObjectData\nwith Serialization" +
"Info and StreamingContext parameters " +
"generates \nthe following output.\n" );
try
{
// This code forces a division by 0 and catches the
// resulting exception.
try
{
int zero = 0;
int ecks = 1 / zero;
}
catch( Exception ex )
{
// Create a new exception to throw again.
SecondLevelException newExcept =
new SecondLevelException(
"Forced a division by 0 and threw " +
"another exception.", ex );
Console.WriteLine(
"Forced a division by 0, caught the " +
"resulting exception, \n" +
"and created a derived exception:\n" );
Console.WriteLine( "HelpLink: {0}",
newExcept.HelpLink );
Console.WriteLine( "Source: {0}",
newExcept.Source );
// This FileStream is used for the serialization.
FileStream stream =
new FileStream( "NewException.dat",
FileMode.Create );
try
{
// Serialize the derived exception.
SoapFormatter formatter =
new SoapFormatter( null,
new StreamingContext(
StreamingContextStates.File ) );
formatter.Serialize( stream, newExcept );
// Rewind the stream and deserialize the
// exception.
stream.Position = 0;
SecondLevelException deserExcept =
(SecondLevelException)
formatter.Deserialize( stream );
Console.WriteLine(
"\nSerialized the exception, and then " +
"deserialized the resulting stream " +
"into a \nnew exception. " +
"The deserialization changed the case " +
"of certain properties:\n" );
// Throw the deserialized exception again.
throw deserExcept;
}
catch( SerializationException se )
{
Console.WriteLine( "Failed to serialize: {0}",
se.ToString( ) );
}
finally
{
stream.Close( );
}
}
}
catch( Exception ex )
{
Console.WriteLine( "HelpLink: {0}", ex.HelpLink );
Console.WriteLine( "Source: {0}", ex.Source );
Console.WriteLine( );
Console.WriteLine( ex.ToString( ) );
}
}
}
}
/*
This example of the Exception constructor and Exception.GetObjectData
with SerializationInfo and StreamingContext parameters generates
the following output.
Forced a division by 0, caught the resulting exception,
and created a derived exception:
HelpLink: https://MSDN.Microsoft.com
Source: Exception_Class_Samples
Serialized the exception, and then deserialized the resulting stream into a
new exception. The deserialization changed the case of certain properties:
HelpLink: https://msdn.microsoft.com
Source: EXCEPTION_CLASS_SAMPLES
NDP_UE_CS.SecondLevelException: Forced a division by 0 and threw another except
ion. ---> System.DivideByZeroException: Attempted to divide by zero.
at NDP_UE_CS.SerializationDemo.Main()
--- End of inner exception stack trace ---
at NDP_UE_CS.SerializationDemo.Main()
*/
// Example for the Exception( SerializationInfo, StreamingContext )
// constructor and the Exception.GetObjectData( SerializationInfo,
// StreamingContext ) method.
#using <System.Runtime.Serialization.Formatters.Soap.dll>
using namespace System;
using namespace System::IO;
using namespace System::Runtime::Serialization;
using namespace System::Runtime::Serialization::Formatters::Soap;
// Define a serializable derived exception class.
[Serializable]
ref class SecondLevelException: public Exception, public ISerializable
{
public:
// This public constructor is used by class instantiators.
SecondLevelException( String^ message, Exception^ inner )
: Exception( message, inner )
{
HelpLink = "https://MSDN.Microsoft.com";
Source = "Exception_Class_Samples";
}
protected:
// This protected constructor is used for deserialization.
SecondLevelException( SerializationInfo^ info, StreamingContext context )
: Exception( info, context )
{}
public:
// GetObjectData performs a custom serialization.
[System::Security::Permissions::SecurityPermissionAttribute
(System::Security::Permissions::SecurityAction::LinkDemand,
Flags=System::Security::Permissions::SecurityPermissionFlag::SerializationFormatter)]
virtual void GetObjectData( SerializationInfo^ info, StreamingContext context ) override
{
// Change the case of two properties, and then use the
// method of the base class.
HelpLink = HelpLink->ToLower();
Source = Source->ToUpper();
Exception::GetObjectData( info, context );
}
};
int main()
{
Console::WriteLine( "This example of the Exception constructor "
"and Exception.GetObjectData\nwith Serialization"
"Info and StreamingContext parameters "
"generates \nthe following output.\n" );
try
{
// This code forces a division by 0 and catches the
// resulting exception.
try
{
int zero = 0;
int ecks = 1 / zero;
}
catch ( Exception^ ex )
{
// Create a new exception to throw again.
SecondLevelException^ newExcept = gcnew SecondLevelException( "Forced a division by 0 and threw "
"another exception.",ex );
Console::WriteLine( "Forced a division by 0, caught the "
"resulting exception, \n"
"and created a derived exception:\n" );
Console::WriteLine( "HelpLink: {0}", newExcept->HelpLink );
Console::WriteLine( "Source: {0}", newExcept->Source );
// This FileStream is used for the serialization.
FileStream^ stream = gcnew FileStream( "NewException.dat",FileMode::Create );
try
{
// Serialize the derived exception.
SoapFormatter^ formatter = gcnew SoapFormatter( nullptr,StreamingContext(StreamingContextStates::File) );
formatter->Serialize( stream, newExcept );
// Rewind the stream and deserialize the
// exception.
stream->Position = 0;
SecondLevelException^ deserExcept = dynamic_cast<SecondLevelException^>(formatter->Deserialize( stream ));
Console::WriteLine( "\nSerialized the exception, and then "
"deserialized the resulting stream "
"into a \nnew exception. "
"The deserialization changed the case "
"of certain properties:\n" );
// Throw the deserialized exception again.
throw deserExcept;
}
catch ( SerializationException^ se )
{
Console::WriteLine( "Failed to serialize: {0}", se->ToString() );
}
finally
{
stream->Close();
}
}
}
catch ( Exception^ ex )
{
Console::WriteLine( "HelpLink: {0}", ex->HelpLink );
Console::WriteLine( "Source: {0}", ex->Source );
Console::WriteLine();
Console::WriteLine( ex->ToString() );
}
}
/*
This example of the Exception constructor and Exception.GetObjectData
with SerializationInfo and StreamingContext parameters generates
the following output.
Forced a division by 0, caught the resulting exception,
and created a derived exception:
HelpLink: https://MSDN.Microsoft.com
Source: Exception_Class_Samples
Serialized the exception, and then deserialized the resulting stream into a
new exception. The deserialization changed the case of certain properties:
HelpLink: https://msdn.microsoft.com
Source: EXCEPTION_CLASS_SAMPLES
SecondLevelException: Forced a division by 0 and threw another exception. ---> S
ystem.DivideByZeroException: Attempted to divide by zero.
at main()
--- End of inner exception stack trace ---
at main()
*/
.NET Framework 安全性
- SecurityPermission 表示提供序列化服务的能力。要求值:LinkDemand;权限值:SerializationFormatter
平台
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
请参见
参考
Exception 类
Exception 成员
System 命名空间
SerializationInfo
StreamingContext