.NET运行时序列化

Yip*_*Yay 5 c# serialization interface

有人可以解释从ISerializable界面继承和声明对象之间的区别是[Serializable]什么?

我知道在第一种情况下你必须实现ISerializable接口成员,而在第二种情况下,这项工作可能由C#本身完成.

但是对我来说没有意义的是以下行为:

public void Foo<T>() where T : ISerializable
{
   // Whatever
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我有这样的课:

[Serializable]
public class Value
{
    public String Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我不能打电话给我X.Foo<Value>(),因为编译器说:

There is no implicit reference conversion from 'Value' to 'System.Runtime.Serialization.ISerializable'
Run Code Online (Sandbox Code Playgroud)

我很确定这是我对一些显而易见的事情的误解,所以请指出我做错了什么.


更新(重要:)

如何使where T : ISerializable语句也适用于[Serializable]类?有办法吗?

我想要实现的是编译时错误,如果提供的类型T不可序列化(通过使用[Serializable]或ISerializable方式).

显然,我当前的检查仅处理第二种情况,那么如何让它处理它们呢?

Oha*_*der 4

Serializable只是您放置在类上的一个属性,以便让诸如此类的类SoapFormatter知道(通过反射)它可以被序列化。用属性装饰类并不会使类实现接口,这就是编译器在您的情况下抱怨的原因。ISerializable如果没记错的话,如果想要对序列化过程有更多的控制,就可以实现。