一个类可以通过简单地将一个属性应用到它的定义来启用序列化。而且在 C# 中没有办法发生编译时错误,因为类型缺少属性,所以不,您无法在编译时捕获序列化不可序列化类型的尝试。
如果您使用标准库方法进行序列化,任何尝试对不支持它的类进行序列化都会产生异常,因此您无需在运行时进行任何特殊检查。
另外,让你的包装方法通用也没什么意义。参数可以是任何类型,没有可以有效限制它的约束,所以它也可以是一个普通的旧object。
但是,如果您避免使用内置的 .NET 序列化框架,您可以开发自己的经过编译时检查的框架。您必须适当地使用类型系统——也就是说,定义一个任何可序列化类型都必须实现的接口。然后您的SerializeToText 方法将接受对该接口的引用。
interface ICanSerialize
{
void Serialize(ISerializeMedium m);
}
interface ISerializeMedium
{
void Serialize(string name, ref int value);
void Serialize(string name, ref bool value);
void Serialize(string name, ref string value);
void Serialize<T>(string name, ref T value) where T : ICanSerialize;
void Serialize<T>(string name, ref ICollection<T> value) where T : ICanSerialize;
// etc.
}
可序列化类型如下所示:
class C : ICanSerialize
{
string _firstName;
bool _happy;
public void Serialize(ISerializeMedium m)
{
m.Serialize("firstName", ref _firstName);
m.Serialize("happy", ref _happy);
}
}
那么你只需要一个ISerializeMedium 的实现。这样的框架从头开始对序列化的所有使用施加类型安全,而不是试图在之后适应它,这是不可能的。
这都涉及到一定数量的轮子改造,但有时你需要一个更圆的轮子。