我有扩展方法
public static T DeepClone<T>(this T source) where T : ISerializable
{
..
}
当我添加“where T:ISerializable”时,我在使用具有[Serializable]属性的DeepClone()的所有类上都会出错。
修改
答案 0 :(得分:3)
有两种方法可以使类型可序列化。
在您的情况下,您只考虑第一个。
要解决此问题,只需让序列化程序处理错误报告。它将为任何不可序列化的对象抛出错误。
答案 1 :(得分:2)
问题是分配属性(Serializable
)与实现接口(ISerializable
)没有任何共同之处。
答案 2 :(得分:2)
我想我会更多地回答这个问题。 [Serializable] vs ISerializable是让我困惑了一段时间的东西,我终于理顺了它。
如果希望类可序列化,则应用[Serializable]属性。这就是你所需要的(今天也是如此)。但是,有时您需要更好地控制序列化过程(可能序列化对象的接收者有一些严格的要求,您的对象不太关心)。要处理在.NET 2.0之前版本中对象的如何的任何自定义,除了应用[Serializable]属性外,还实现了ISerializable接口。
ISerializable接口只有一个功能要求:
void GetObjectData(SerializationInfo info,StreamingContext context)
在此功能中,您序列化了内容:
GetObjectData(SerializationInfo info,StreamingContext context)
{
// example of some type of customization of the serialization process, giving
// your serialized class member a custom name
info.AddValue("GiveMyDataMemberCustomNameInOutput", myDataMember);
...
通过一些其他[Serializable]属性的出现(.NET 2.0),您不需要实现ISerializable.GetObjectData()以自定义 如何序列化。< / p>
那么你如何以新的方式处理时髦的序列化呢?那么[Serializable]有一些合作伙伴,特别是[OnSerializing]和[OnDeserialized]。如果您需要执行与ISerializable.GetObjectData()相关的时髦序列化/反序列化,现在可以在事件中处理它。
我想指出两件事:
答案 3 :(得分:1)
您必须将ISerializable接口添加到您的类
public class YourClass : ISerializable