c# - 在 C# 中为可序列化类型创建接口(interface)?

标签 c# interface

在 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/

相关文章:

c# - Quartz.Net cron 触发器每 45 分钟安排一次工作

C#:抽象类需要实现接口(interface)?

Java 接口(interface)多态性

C++ 是否为某些通用读和/或写访问分离了抽象类(接口(interface))?

java - 为什么 instanceof 有时不编译,有时返回 false?

java - 不使用 lambda 实现 `IntegerMath addition` 和 `IntegerMath subtraction` 吗?

c# - 保护交付给客户的源代码

c# - 如何从 Visual Studio 加载项获取项目目录

c# - SelectMany 三层深

c# - 忽略 ASP.NET Web API 中的 Controller