我们假设我有这个非常有用的界面:
public interface IFoo
{
void Bar();
}
我知道这个接口将在需要序列化/反序列化的上下文中使用,所以我使这个接口扩展ISerializable
以强制此接口的所有实现都可序列化并向接口客户端显示:
public interface IFoo : ISerializable
{
void Bar();
}
但现在我遇到了问题。 IFoo
的所有具体实现都被迫实现GetObjectData
数据,即使在仅使用Serializable
属性标记类完全正常的情况下也是如此:
[Serializable]
public sealed class FooWithString : IFoo
{
public string MyString { get; set; }
public void Bar()
{
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("MyString", MyString, typeof(string)); // This is pointless, but I have to do it
}
private FooWithString(SerializationInfo info, StreamingContext context)
{
MyString = info.GetString("MyString"); // And this is pointless too, but I have to do it
}
}
这个例子非常简单,但是如果我有一个5-6个整数的类,那么这个图像是什么?这伤害了很多!
有没有办法实现这样的目标:
[Serializable]
public sealed class FooWithString2 : IFoo
{
public string MyString { get; set; }
public void Bar()
{
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
UseDefaultSerializationMechanism();
}
private FooWithString(SerializationInfo info, StreamingContext context)
{
UseDefaultDeserializationMechanism();
}
}
甚至更酷:
[Serializable]
public sealed class FooWithString3 : IFoo
{
public string MyString { get; set; }
public void Bar()
{
}
// No pointless implementations!
}