是否可以使用 PostSharp 方面注入代码来读取/写入对象的属性?例如,考虑以下类:
[ BinarySerializable ]
public class Employee {
public string Name {get; set; }
public string Title {get; set;}
}
在这种情况下,“BinarySerializable”将是一个引入自定义“IBinarySerializable”接口的自定义方面,如下所示:
public interface IBinarySerializable
{
void Write(BinaryWriter writer);
void Read(BinaryReader reader);
}
编译后,生成的类如下所示:
public class Employee : IBinarySerializable
{
public string Name {get; set;}
public string Title {get; set; }
void IBinarySerializable.Write(BinaryWriter writer)
{
writer.Write(Name);
writer.Write(Title);
}
void IBinarySerializable.Read(BinaryReader reader)
{
Name = reader.ReadString();
Title = reader.ReadString();
}
}
直觉上,我觉得这应该可以使用 PostSharp,但我需要一些关于正确方法的指导。如果这是可能的,那么如何处理本身由其他方面注入的属性?
更新:我尝试使用内置的 PSerializable 方面创建一个简单的示例,但是当成员从不具有该属性的 .NET 框架类继承时遇到了问题。
将 [PSerializable] 属性添加到 EmployeeCollection 类无法编译,并显示“无法将 [PSerializable] 应用于类型 'AOPSerialization.EmployeeCollection',因为基本类型没有 [PSerializable] 或 [Serializer] 属性”。
从 EmployeeCollection 类中省略 [PSerializable] 属性会引发运行时 PortableSerializationException:找不到类型“AOPSerialization.EmployeeCollection”的序列化程序。
例如:
[PSerializable]
public class AOPComponent
{
public string Title { get; set; }
public string Description { get; set; }
public AOPComponent(string title, string description){...}
}
[PSerializable]
public class AOPComponentCollection<T> : ObservableCollection<T>
{...}
[PSerializable]
public class EmployeeCollection : AOPComponentCollection<Employee>
{...}
[PSerializable]
public class Company : AOPComponent
{
public EmployeeCollection Engineers { get; set; }
public EmployeeCollection Managers { get; set; }
}
我发现 Serializer 和 ImportSerializer 属性用于告诉 PortableFormatter 使用哪个自定义 ISerializer 或 ISerializerFactory 实现。
但问题仍然存在:
如何为通用基本集合类型指定自定义序列化程序?
此方法失败,因为属性可能不包含类型参数。
[PSerializable, ImportSerializer(typeof(ObservableCollection<T>), typeof(AOPComponentSerializerFactory))]
public class AOPComponentCollection<T> : ObservableCollection<T> where T : AOPComponent
{...}
此方法失败,因为 PostSharp 找不到 ObservableCollection< T > 的序列化程序
[PSerializable, Serializer(typeof(AOPComponentSerializerFactory))]
public class AOPComponentCollection<T> : ObservableCollection<T> where T : AOPComponent
{...}