次の方法で共有


SerializationBinder クラス

ユーザーがクラスの読み込みを制御したり、読み込むクラスを指定したりできるようにします。

この型のすべてのメンバの一覧については、SerializationBinder メンバ を参照してください。

System.Object
   System.Runtime.Serialization.SerializationBinder

<Serializable>
MustInherit Public Class SerializationBinder
[C#]
[Serializable]
public abstract class SerializationBinder
[C++]
[Serializable]
public __gc __abstract class SerializationBinder
[JScript]
public
   Serializable
abstract class SerializationBinder

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

シリアル化中に、フォーマッタは、正しい型およびバージョンのオブジェクトのインスタンスを作成するために必要な情報を送信します。通常、この情報には、オブジェクトの完全な型名および完全なアセンブリ名が含まれます。アセンブリ名には、アセンブリの名前、バージョン、および厳密な名前 (厳密な名前付きアセンブリ を参照) ハッシュが含まれます。既定では、逆シリアル化でこの情報を使用して、同一のオブジェクトのインスタンスを作成します。セキュリティ ポリシーで制限されるアセンブリの読み込みの場合は例外です。クラスがアセンブリ間を移動したためか、異なるバージョンのクラスがサーバー上およびクライアント上で必要であるためのいずれかの理由で、一部のユーザーはどのクラスを読み込むかを制御する必要があります。

これは抽象基本クラスです。すべてのバインダはこのクラスを拡張します。

継承時の注意: SerializationBinder から継承する場合は、 BindToType のメンバをオーバーライドする必要があります。

使用例

 
Imports System
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Reflection
Imports System.Security.Permissions

Class App
   <STAThread()> Shared Sub Main()
      Serialize()
      Deserialize()
   End Sub


   Shared Sub Serialize()
      ' To serialize the objects, you must first open a stream for writing. 
      ' Use a file stream here.
      Dim fs As New FileStream("DataFile.dat", FileMode.Create)

      Try
         ' Construct a BinaryFormatter and use it 
         ' to serialize the data to the stream.
         Dim formatter As New BinaryFormatter

         ' Construct a Version1Type object and serialize it.
         Dim obj As New Version1Type
         obj.x = 123
         formatter.Serialize(fs, obj)
      Catch e As SerializationException
         Console.WriteLine("Failed to serialize. Reason: " & e.Message)
         Throw
      Finally
         fs.Close()
      End Try
   End Sub


   Shared Sub Deserialize()
      ' Declare the Version2Type reference.
      Dim obj As Version2Type = Nothing

      ' Open the file containing the data that you want to deserialize.
      Dim fs As New FileStream("DataFile.dat", FileMode.Open)
      Try
         ' Construct a BinaryFormatter and use it 
         ' to deserialize the data from the stream.
         Dim formatter As New BinaryFormatter

         ' Construct an instance of the 
         ' Version1ToVersion2TypeSerialiationBinder type.
         ' This Binder type can deserialize a Version1Type  
         ' object to a Version2Type object.
         formatter.Binder = New Version1ToVersion2DeserializationBinder

         obj = DirectCast(formatter.Deserialize(fs), Version2Type)
      Catch e As SerializationException
         Console.WriteLine("Failed to deserialize. Reason: " & e.Message)
         Throw
      Finally
         fs.Close()
      End Try

      ' To prove that a Version2Type object was deserialized, 
      ' display the object's type and fields to the console.
      Console.WriteLine("Type of object deserialized: {0}", obj.GetType())
      Console.WriteLine("x = {0}, name = {1}", obj.x, obj.name)
   End Sub
End Class


<Serializable()> Class Version1Type
   Public x As Int32
End Class


<Serializable()> Class Version2Type
   Implements ISerializable
   Public x As Int32
   Public name As String

   ' The security attribute demands that code that calls  
   ' this method have permission to perform serialization.
   <SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter:=True)> _
   Private Sub GetObjectData(ByVal info As SerializationInfo, _
         ByVal context As StreamingContext) Implements ISerializable.GetObjectData
      info.AddValue("x", x)
      info.AddValue("name", name)
   End Sub

   ' The security attribute demands that code that calls  
   ' this method have permission to perform serialization.
   <SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter:=True)> _
   Private Sub New(ByVal info As SerializationInfo, _
         ByVal context As StreamingContext)
      x = info.GetInt32("x")
      Try
         name = info.GetString("name")
      Catch e As SerializationException
         ' The "name" field was not serialized because 
         ' Version1Type did not contain this field.
         ' Set this field to a reasonable default value.
         name = "Reasonable default value"
      End Try
   End Sub
End Class


NotInheritable Class Version1ToVersion2DeserializationBinder
   Inherits SerializationBinder
   Public Overrides Function BindToType(ByVal assemblyName As String, _
         ByVal typeName As String) As Type

      Dim typeToDeserialize As Type = Nothing

      ' For each assemblyName/typeName that you want to deserialize
      ' to a different type, set typeToDeserialize to the desired type.
      Dim assemVer1 As String = [Assembly].GetExecutingAssembly().FullName
      Dim typeVer1 As String = GetType(Version1Type).FullName

      If assemblyName = assemVer1 And typeName = typeVer1 Then
         ' To use a type from a different assembly version, 
         ' change the version number.
         ' To do this, uncomment the following code.
         ' assemblyName = assemblyName.Replace("1.0.0.0", "2.0.0.0")

         ' To use a different type from the same assembly, 
         ' change the type name.
         typeName = typeName.Replace("Version1Type", "Version2Type")
      End If

      ' The following code returns the type.
      typeToDeserialize = Type.GetType(String.Format("{0}, {1}", typeName, _
                                       assemblyName))

      Return typeToDeserialize
   End Function
End Class

[C#] 
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;
using System.Security.Permissions;


class App 
{
    [STAThread]
    static void Main() 
    {
        Serialize();
        Deserialize();
    }

    static void Serialize() 
    {
        // To serialize the objects, you must first open a stream for writing. 
        // Use a file stream here.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Create);

        try 
        {
            // Construct a BinaryFormatter and use it 
            // to serialize the data to the stream.
            BinaryFormatter formatter = new BinaryFormatter();

            // Construct a Version1Type object and serialize it.
            Version1Type obj = new Version1Type();
            obj.x = 123;
            formatter.Serialize(fs, obj);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }
    }

   
    static void Deserialize() 
    {
        // Declare the Version2Type reference.
        Version2Type obj = null;

        // Open the file containing the data that you want to deserialize.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
        try 
        {
            // Construct a BinaryFormatter and use it 
            // to deserialize the data from the stream.
            BinaryFormatter formatter = new BinaryFormatter();

            // Construct an instance of our the
            // Version1ToVersion2TypeSerialiationBinder type.
            // This Binder type can deserialize a Version1Type  
            // object to a Version2Type object.
            formatter.Binder = new Version1ToVersion2DeserializationBinder();

            obj = (Version2Type) formatter.Deserialize(fs);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to deserialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }

        // To prove that a Version2Type object was deserialized, 
        // display the object's type and fields to the console.
        Console.WriteLine("Type of object deserialized: " + obj.GetType());
        Console.WriteLine("x = {0}, name = {1}", obj.x, obj.name);
    }
}


[Serializable]
class Version1Type 
{
    public Int32 x;
}


[Serializable]
class Version2Type : ISerializable 
{
    public Int32 x;
    public String name;
   
    // The security attribute demands that code that calls
    // this method have permission to perform serialization.
    [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    {
        info.AddValue("x", x);
        info.AddValue("name", name);
    }

    // The security attribute demands that code that calls  
    // this method have permission to perform serialization.
    [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]
    private Version2Type(SerializationInfo info, StreamingContext context) 
    {
        x = info.GetInt32("x");
        try 
        {
            name = info.GetString("name");
        }
        catch (SerializationException) 
        {
            // The "name" field was not serialized because Version1Type 
            // did not contain this field.
            // Set this field to a reasonable default value.
            name = "Reasonable default value";
        }
    }
}


sealed class Version1ToVersion2DeserializationBinder : SerializationBinder 
{
    public override Type BindToType(string assemblyName, string typeName) 
    {
        Type typeToDeserialize = null;

        // For each assemblyName/typeName that you want to deserialize to
        // a different type, set typeToDeserialize to the desired type.
        String assemVer1 = Assembly.GetExecutingAssembly().FullName;
        String typeVer1 = "Version1Type";

        if (assemblyName == assemVer1 && typeName == typeVer1) 
        {
            // To use a type from a different assembly version, 
            // change the version number.
            // To do this, uncomment the following line of code.
            // assemblyName = assemblyName.Replace("1.0.0.0", "2.0.0.0");

            // To use a different type from the same assembly, 
            // change the type name.
            typeName = "Version2Type";
        }

        // The following line of code returns the type.
        typeToDeserialize = Type.GetType(String.Format("{0}, {1}", 
            typeName, assemblyName));

        return typeToDeserialize;
    }
}

[C++] 
#using <mscorlib.dll>

using namespace System;
using namespace System::IO;
using namespace System::Runtime::Serialization;
using namespace System::Runtime::Serialization::Formatters::Binary;
using namespace System::Reflection;
using namespace System::Security::Permissions;

__sealed __gc class Version1ToVersion2DeserializationBinder;

[Serializable]
__gc class Version1Type
{
public:
    Int32 x;
};

[Serializable]
__gc class Version2Type : public ISerializable
{
public:
    Int32 x;
    String* name;

    // The security attribute demands that code that calls  
    // this method have permission to perform serialization.
    [SecurityPermissionAttribute(SecurityAction::Demand, SerializationFormatter=true)]
    void GetObjectData(SerializationInfo* info, StreamingContext context) 
    {
        info->AddValue(S"x", x);
        info->AddValue(S"name", name);
    }

    // The security attribute demands that code that calls  
    // this method have permission to perform serialization.
private:
    [SecurityPermissionAttribute(SecurityAction::Demand, SerializationFormatter=true)]
    Version2Type(SerializationInfo* info, StreamingContext context) 
    {
        x = info->GetInt32(S"x");
        try 
        {
            name = info->GetString(S"name");
        } 
        catch (SerializationException*) 
        {
            // The 'name' field was not serialized because Version1Type 
            // did not contain this field.
            // We will set this field to a reasonable default value.
            name = "Reasonable default value";
        }
    }
};

__sealed __gc class Version1ToVersion2DeserializationBinder : public SerializationBinder 
{
public:
    Type* BindToType(String* assemblyName, String* typeName) 
    {
        Type* typeToDeserialize = 0;

        // For each assemblyName/typeName that you want to deserialize to
        // a different type, set typeToDeserialize to the desired type.
        String* assemVer1 = Assembly::GetExecutingAssembly()->FullName;
        String* typeVer1 = "Version1Type";

        if (assemblyName->Equals(assemVer1) && typeName->Equals(typeVer1))
        {
            // To use a type from a different assembly version, 
            // change the version number using the following line of code.
            // assemblyName = assemblyName.Replace("1.0.0.0", "2.0.0.0");

            // To use a different type from the same assembly, 
            // change the type name.
            typeName = "Version2Type";
        }

        // The following line of code returns the type.
        typeToDeserialize = Type::GetType(String::Format("{0}, {1}", 
            typeName, assemblyName));

        return typeToDeserialize;
    }
};

__gc class App 
{
public:
    static void Serialize() 
    {
        // To serialize the objects, you must first open a stream for writing. 
        // We will use a file stream here.
        FileStream* fs = new FileStream(S"DataFile.dat", FileMode::Create);

        try 
        {
            // Construct a BinaryFormatter and use it 
            // to serialize the data to the stream.
            BinaryFormatter* formatter = new BinaryFormatter();

            // Construct a Version1Type Object and serialize it.
            Version1Type* obj = new Version1Type();
            obj->x = 123;
            formatter->Serialize(fs, obj);
        } 
        catch (SerializationException* e) 
        {
            Console::WriteLine(S"Failed to serialize. Reason: {0}", e->Message);
            throw;
        }
        __finally 
        {
            fs->Close();
        }
    }

    static void Deserialize() 
    {
        // Declare the Version2Type reference.
        Version2Type* obj = 0;

        // Open the file containing the data that we want to deserialize.
        FileStream* fs = new FileStream(S"DataFile.dat", FileMode::Open);
        try 
        {
            // Construct a BinaryFormatter and use it 
            // to deserialize the data from the stream.
            BinaryFormatter* formatter = new BinaryFormatter();

            // Construct an instance of our 
            // Version1ToVersion2TypeSerialiationBinder type.
            // This Binder type knows how to deserialize a Version1Type  
            // Object* to a Version2Type Object.
            formatter->Binder = new Version1ToVersion2DeserializationBinder();

            obj = dynamic_cast<Version2Type*>(formatter->Deserialize(fs));
        }
        catch (SerializationException* e) 
        {
            Console::WriteLine(S"Failed to deserialize. Reason: {0}", e->Message);
            throw;
        }
        __finally 
        {
            fs->Close();
        }

        // To prove that a Version2Type Object* was deserialized, 
        // display the Object's type and fields to the console.
        Console::WriteLine(S"Type of Object deserialized: {0}", obj->GetType());
        Console::WriteLine(S"x = {0}, name = {1}", __box(obj->x), obj->name);
    }
};

[STAThread]
int main() 
{
    App::Serialize();
    App::Deserialize();
    return 0;
}


[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Runtime.Serialization

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

SerializationBinder メンバ | System.Runtime.Serialization 名前空間 | StrongName