gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:06:52 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com