阅读量:0
在.NET中,使用System.Reflection
实现序列化主要涉及到TypeDescriptor
类
首先,创建一个自定义的类,例如Person
:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
然后,创建一个实现ICustomTypeDescriptor
接口的类,例如PersonTypeDescriptor
:
using System; using System.ComponentModel; using System.Reflection; public class PersonTypeDescriptor : ICustomTypeDescriptor { private readonly Type _type; public PersonTypeDescriptor(Type type) { _type = type; } public AttributeCollection GetAttributes(TypeDescriptionProvider provider, object value) { return new AttributeCollection(new CustomAttributeData[] { new AttributeData(typeof(DisplayNameAttribute), new object[] { "Person" }) }); } public TypeConverter GetConverter(TypeDescriptionProvider provider, object value) { return null; } public PropertyDescriptorCollection GetProperties(TypeDescriptionProvider provider, object value) { var properties = new PropertyDescriptorCollection(); foreach (var property in _type.GetProperties()) { properties.Add(new PropertyDescriptor(property)); } return properties; } public object GetPropertyOwner(PropertyDescriptor pd) { return null; } }
在这个例子中,我们为Person
类添加了一个DisplayNameAttribute
属性。
接下来,使用TypeDescriptor.Register
方法注册自定义的PersonTypeDescriptor
:
using System; using System.ComponentModel; using System.Reflection; class Program { static void Main() { TypeDescriptor.Register(typeof(Person), new PersonTypeDescriptor(typeof(Person))); var person = new Person { FirstName = "John", LastName = "Doe", Age = 30 }; IFormatter formatter = new BinaryFormatter(); using (var stream = new System.IO.MemoryStream()) { formatter.Serialize(stream, person); stream.Position = 0; var deserializedPerson = (Person)formatter.Deserialize(stream); Console.WriteLine($"Deserialized Person: {deserializedPerson.FirstName} {deserializedPerson.LastName}, {deserializedPerson.Age}"); } } }
在这个例子中,我们使用BinaryFormatter
序列化和反序列化Person
对象。由于我们注册了自定义的PersonTypeDescriptor
,所以序列化和反序列化过程中会使用到它提供的属性和方法。
需要注意的是,BinaryFormatter
已经被认为是不安全的,因为它容易受到攻击。在实际项目中,建议使用其他更安全的序列化库,如Json.NET
(现在称为Newtonsoft.Json
)或System.Text.Json
。这些库通常不需要手动实现自定义的ICustomTypeDescriptor
。