本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

Exception.GetObjectData 方法 (SerializationInfo, StreamingContext)

 

当在派生类中重写时,用关于异常的信息设置 SerializationInfo

命名空间:   System
程序集:  mscorlib(位于 mscorlib.dll)

[SecurityCriticalAttribute]
public virtual void GetObjectData(
	SerializationInfo info,
	StreamingContext context
)

参数

info
Type: System.Runtime.Serialization.SerializationInfo

SerializationInfo,它保存关于所引发异常的序列化对象数据。

context
Type: System.Runtime.Serialization.StreamingContext

StreamingContext,它包含关于源或目标的上下文信息。

Exception Condition
ArgumentNullException

info 参数为 null 引用(在 Visual Basic 中为 Nothing)。

GetObjectData 使用针对于序列化的所有异常对象数据设置 SerializationInfo 反序列化期间,从通过流传输的 SerializationInfo 重建异常。

下面的代码示例定义一个派生可序列化Exception类,该类实现GetObjectData,从而细微的更改将对两个属性,然后调用的基类执行序列化。 该示例强制被零除错误,然后创建派生的异常的实例。 代码将序列化到文件的实例,将该文件反序列化为一个新异常,则会引发,然后捕获并显示异常的数据。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.Security.Permissions;

 // 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 = "http://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.ToUpperInvariant();

         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 displays the following output.

Forced a division by 0, caught the resulting exception,
and created a derived exception:

HelpLink: http://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: http://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()
*/

SecurityCriticalAttribute

requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

.NET Framework
自 1.1 起可用
返回页首
显示: