SerializationInfoEnumerator 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供适用于格式化程序的机制,用于分析 SerializationInfo 中的数据。 此类不能被继承。
public ref class SerializationInfoEnumerator sealed : System::Collections::IEnumerator
public sealed class SerializationInfoEnumerator : System.Collections.IEnumerator
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class SerializationInfoEnumerator : System.Collections.IEnumerator
type SerializationInfoEnumerator = class
interface IEnumerator
[<System.Runtime.InteropServices.ComVisible(true)>]
type SerializationInfoEnumerator = class
interface IEnumerator
Public NotInheritable Class SerializationInfoEnumerator
Implements IEnumerator
- 继承
-
SerializationInfoEnumerator
- 属性
- 实现
示例
下面的代码示例演示如何使用 FormatterServices 类来正确序列化或反序列化基类不实现 ISerializable 但派生类的对象。
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
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;
// 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";
}
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);
}
}
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
注解
当前类是一个标准枚举器,用于分析存储在中的 SerializationInfo值。 保留 SerializationInfoEnumerator 指向创建值的成员变量的 SerializationInfo 指针,而不是记录这些值。
此类遵循 IEnumerator 机制。
属性
Current |
获取当前所检查的项。 |
Name |
获取当前所检查的项的名称。 |
ObjectType |
获取当前所检查的项的类型。 |
Value |
获取当前所检查的项的值。 |
方法
Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
GetHashCode() |
作为默认哈希函数。 (继承自 Object) |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (继承自 Object) |
MoveNext() |
将枚举器更新到下一项。 |
Reset() |
将枚举器重置为第一项。 |
ToString() |
返回表示当前对象的字符串。 (继承自 Object) |
显式接口实现
IEnumerator.Current |
获取集合中的当前项。 |