在.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
。