0

是否可以使用 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
{...}
4

1 回答 1

1

It would be possible to do that with PostSharp, but only by using the low-level PostSharp SDK, which is undocumented and unsupported.

Good news are that we already implemented this for you, in the namespace PostSharp.Serialization. The aspect is [PSerializable] and the formatter is PortableFormatter.

于 2013-09-06T15:41:52.773 回答