在 Haskell 中,我们可以这样做:
class Binary a where
encode :: a -> ByteString
decode :: ByteString -> a
instance Binary Int where
encode x = ...
decode bytes = ...
这定义了 Binary
接口(interface),Int
实现了它。我们现在可以将 Int
转换为字节数组,反之亦然。我希望在 C# 中实现相同的功能,我的第一直觉是创建接口(interface):
interface Binary<T> {
byte[] Encode(T);
static T Decode(byte[]);
}
但这失败了,因为 Decode
不允许是 static
。
如何在 C# 中尽可能干净地实现它?
请注意,我不想要一个创建“空”或部分初始化的 T
然后通过调用非 static
来填充它的解决方案解码
:这会很困惑,并且会打开一个窗口,在此期间对象的使用是潜在的错误来源。
谢谢!
最佳答案
没有真正的方法直接将static方法添加到接口(interface)中,但是可以做的是将此方法添加到扩展类中或在派生类中实现它(这几乎是全部我们可以用 static 方法):
但在这种情况下我会做什么(如果出于某种原因我选择不使用标准 .Net 序列化框架)我可能会创建自己的序列化程序类:
interface ISerializer<T> : IDisposable
{
virtual byte[] Serialize(T instance);
virtual T DeSerialize(byte[] stream);
}
Class MySerializer<T> : ISerializer<T>
{
public override byte[] Serialize(object instance)
{
// .. serialization logic
}
public override T DeSerialize(byte[] stream)
{
// .. deserialization logic
}
public void Dispose()
{
// .. dispose all managed resources here
}
}
class MyClass
{
}
用法:
MyClass instance = new MyClass();
MyClass newInstance = null;
using(ISerializer<MyClass> serializer = new MySerializer<MyClass>())
{
bytes[] bytes = serializer.Serialize(instance);
newInstance = serializer.DeSerialize(bytes);
}
关于c# - 在 C# 中为可序列化类型创建接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31668757/