FormatterServices.CheckTypeSecurity メソッド
アセンブリ: mscorlib (mscorlib.dll 内)

Public Shared Sub CheckTypeSecurity ( _ t As Type, _ securityLevel As TypeFilterLevel _ )
Dim t As Type Dim securityLevel As TypeFilterLevel FormatterServices.CheckTypeSecurity(t, securityLevel)
- securityLevel
TypeFilterLevel プロパティ値。


このメソッドを使用して、TypeFilterLevel プロパティが Low に設定されている場合に指定した型が逆シリアル化できるかどうかを確認します。
.NET Framework のリモート処理には、自動逆シリアル化の 2 つのレベルとして Low および Full が用意されています。Low は、リモート処理の最も基本的な機能に関連付けられている型だけを逆シリアル化することで、逆シリアル化の攻撃を防ぎます。Full 逆シリアル化レベルは、すべての状況でリモート処理がサポートするすべての型の自動逆シリアル化をサポートします。Low および Full がサポートする .NET Framework リモート処理の型の詳細については、「.NET Framework リモート処理での自動逆シリアル化」を参照してください。

この例では、ISerializable が基本クラスでは実装されていないけれども、派生クラスでは実装されている場合に、オブジェクトをシリアル化または逆シリアル化するために FormatterServices クラスを使用する方法を示しています。
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Serialization.Formatters.Binary; using System.Reflection; using System.Security.Permissions; // Person is a serializable base class. [Serializable] public class Person { private String title; public Person(String title) { this.title = title; } public override String ToString() { return String.Format("{0}", title); } } // Employee is a serializable class derived from Person. [Serializable] public class Employee : Person { private String title; public Employee(String title) : base("Person") { this.title = title; } public override String ToString() { return String.Format("{0} -> {1}", title, base.ToString()); } } // Manager is a serializable and ISerializable class derived from Employee. [Serializable] public class Manager : Employee, ISerializable { private String title; public Manager() : base("Employee") { this.title = "Manager"; } [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public void GetObjectData(SerializationInfo info, StreamingContext context) { // Serialize the desired values for this class. info.AddValue("title", title); // Get the set of serializable members for the class and base classes. Type thisType = this.GetType(); MemberInfo[] mi = FormatterServices.GetSerializableMembers(thisType, context); // Serialize the base class's fields to the info object. for (Int32 i = 0; i < mi.Length; i++) { // Do not serialize fields for this class. if (mi[i].DeclaringType == thisType) continue; // Skip this field if it is marked NonSerialized. if (Attribute.IsDefined(mi[i], typeof(NonSerializedAttribute))) continue; // Get the value of this field and add it to the SerializationInfo object. info.AddValue(mi[i].Name, ((FieldInfo) mi[i]).GetValue(this)); } // Call the method below to see the contents of the SerializationInfo object. DisplaySerializationInfo(info); } private void DisplaySerializationInfo(SerializationInfo info) { SerializationInfoEnumerator e = info.GetEnumerator(); Console.WriteLine("Values in the SerializationInfo:"); while (e.MoveNext()) { Console.WriteLine("Name={0}, ObjectType={1}, Value={2}", e.Name, e.ObjectType, e.Value); } } [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.SerializationFormatter)] protected Manager(SerializationInfo info, StreamingContext context) : base(null) { // Get the set of serializable members for the class and base classes. Type thisType = this.GetType(); MemberInfo[] mi = FormatterServices.GetSerializableMembers(thisType, context); // Deserialize the base class's fields from the info object. for (Int32 i = 0; i < mi.Length; i++) { // Do not deserialize fields for this class. if (mi[i].DeclaringType == thisType) continue; // For easier coding, treat the member as a FieldInfo object FieldInfo fi = (FieldInfo) mi[i]; // Skip this field if it is marked NonSerialized. if (Attribute.IsDefined(mi[i], typeof(NonSerializedAttribute))) continue; // Get the value of this field from the SerializationInfo object. fi.SetValue(this, info.GetValue(fi.Name, fi.FieldType)); } // Deserialize the values that were serialized for this class. title = info.GetString("title"); } public override String ToString() { return String.Format("{0} -> {1}", title, base.ToString()); } } public sealed class App { public static void Main() { Run(); } public static void Run() { using (Stream stream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); Manager m = new Manager(); Console.WriteLine(m.ToString()); formatter.Serialize(stream, m); stream.Position = 0; m = (Manager) formatter.Deserialize(stream); Console.WriteLine(m.ToString()); } } } // This code produces the following output. // // Manager -> Employee -> Person // Values in the SerializaitonInfo: // Name=title, ObjectType=System.String, Value=Manager // Name=Employee+title, ObjectType=System.String, Value=Employee // Name=Person+title, ObjectType=System.String, Value=Person // Manager -> Employee -> Person
using namespace System; using namespace System::IO; using namespace System::Runtime::Serialization; using namespace System::Runtime::Serialization::Formatters; using namespace System::Runtime::Serialization::Formatters::Binary; using namespace System::Reflection; using namespace System::Security::Permissions; // Person is a serializable base class. [Serializable] public ref class Person { private: String^ title; public: Person(String^ title) { this->title = title; } public: virtual String^ ToString() override { return String::Format("{0}", title); } }; // Employee is a serializable class derived from Person. [Serializable] public ref class Employee : public Person { private: String^ title; public: Employee(String^ title) : Person("Person") { this->title = title; } public: virtual String^ ToString() override { return String::Format("{0} -> {1}", title, Person::ToString()); } }; // Manager is a serializable and ISerializable class derived from Employee. [Serializable] ref class Manager : public Employee, public ISerializable { private: String^ title; public: Manager() : Employee("Employee") { this->title = "Manager"; } public: [SecurityPermission(SecurityAction::Demand, SerializationFormatter = true)] virtual void GetObjectData(SerializationInfo^ info, StreamingContext context) { // Serialize the desired values for this class. info->AddValue("title", title); // Get the set of serializable members for the class and base classes. Type^ thisType = this->GetType(); array<MemberInfo^>^ serializableMembers = FormatterServices::GetSerializableMembers(thisType, context); // Serialize the base class's fields to the info object. for each (MemberInfo^ serializableMember in serializableMembers) { // Do not serialize fields for this class. if (serializableMember->DeclaringType != thisType) { // Skip this field if it is marked NonSerialized. if (!(Attribute::IsDefined(serializableMember , NonSerializedAttribute::typeid))) { // Get the value of this field and add it to the // SerializationInfo object. info->AddValue(serializableMember->Name, ((FieldInfo^)serializableMember)->GetValue(this)); } } } // Call the method below to see the contents of the // SerializationInfo object. DisplaySerializationInfo(info); } private: static void DisplaySerializationInfo(SerializationInfo^ info) { Console::WriteLine("Values in the SerializationInfo:"); for each (SerializationEntry^ infoEntry in info) { Console::WriteLine("Name={0}, ObjectType={1}, Value={2}", infoEntry->Name, infoEntry->ObjectType, infoEntry->Value); } } protected: Manager(SerializationInfo^ info, StreamingContext context) : Employee(nullptr) { // Get the set of serializable members for the class and base classes. Type^ thisType = this->GetType(); array<MemberInfo^>^ serializableMembers = FormatterServices::GetSerializableMembers(thisType, context); // Deserialize the base class's fields from the info object. for each (MemberInfo^ serializableMember in serializableMembers) { // Do not deserialize fields for this class. if (serializableMember->DeclaringType != thisType) { // For easier coding, treat the member as a FieldInfo object FieldInfo^ fieldInformation = (FieldInfo^)serializableMember; // Skip this field if it is marked NonSerialized. if (!(Attribute::IsDefined(serializableMember , NonSerializedAttribute::typeid))) { // Get the value of this field from the // SerializationInfo object. fieldInformation->SetValue(this, info->GetValue(fieldInformation->Name, fieldInformation->FieldType)); } } } // Deserialize the values that were serialized for this class. title = info->GetString("title"); } public: virtual String^ ToString() override { return String::Format("{0} -> {1}", title, Employee::ToString()); } }; int main() { Stream^ stream = gcnew MemoryStream(); IFormatter^ formatter = gcnew BinaryFormatter(); Manager^ m = gcnew Manager(); Console::WriteLine(m->ToString()); formatter->Serialize(stream, m); stream->Position = 0; m = (Manager^) formatter->Deserialize(stream); Console::WriteLine(m->ToString()); } // This code produces the following output. // // Manager -> Employee -> Person // Values in the SerializaitonInfo: // Name=title, ObjectType=System.String, Value=Manager // Name=Employee+title, ObjectType=System.String, Value=Employee // Name=Person+title, ObjectType=System.String, Value=Person // Manager -> Employee -> Person

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 によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からFormatterServices.CheckTypeSecurity メソッドを検索する場合は、下記のリンクをクリックしてください。

- FormatterServices.CheckTypeSecurity メソッドのページへのリンク