SerializationBinder.BindToType メソッド
派生クラスでオーバーライドされると、シリアル化されたオブジェクトの型への連結を制御します。
Public MustOverride Function BindToType( _
ByVal assemblyName As String, _ ByVal typeName As String _) As Type
[C#]
public abstract Type BindToType(stringassemblyName,stringtypeName);
[C++]
public: virtual Type* BindToType(String* assemblyName,String* typeName) = 0;
[JScript]
public abstract function BindToType(
assemblyName : String,typeName : String) : Type;
パラメータ
戻り値
フォーマッタが新しいインスタンスを作成する対象のオブジェクトの型。
解説
継承時の注意: 派生クラスで現在のメソッドを実装する必要があります。
使用例
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++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
参照
SerializationBinder クラス | SerializationBinder メンバ | System.Runtime.Serialization 名前空間