如何通过System.Reflection实现序列化

avatar
作者
筋斗云
阅读量: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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!