序列化有优雅的模式吗?

Gig*_*igi 5 c# serialization interface

我经常发现自己在实现此类:

public class Something
{
    public string Serialize()
    {
        // serialization code goes here
    }

    public static Something Deserialize(string str)
    {
        // deserialization code goes here
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过使上面的类实现一个如下所示的接口来在该类型的所有类中强制执行此操作:

public interface ISerializationItem<T>
{
    string Serialize();
    T Deserialize(string str);
}
Run Code Online (Sandbox Code Playgroud)

唉,这是不可能的,因为接口无法覆盖静态方法,并且该方法需要是静态的,这样它才不依赖于类的任何实例。

更新:通常,我会反序列化,如下所示;静态方法有效地用于构造类的实例,因此我不希望手头已经有一个实例来执行此操作:

var str = "Whatever";
var something = Something.Deserialize(str);
Run Code Online (Sandbox Code Playgroud)

是否有适当的方法来强制执行此约束?

kin*_*hen 1

保持“数据”类简单/纯粹的任何逻辑,然后在单独的类中编写序列化过程。这将使维护数据类和序列化器变得更加容易。如果每个类都需要自定义,则创建属性类并使用这些属性装饰您的数据类。

这是一些伪例子......

public class Employee
{
     public int Id { get; set;}

     [ForceSpecialHandling]
     public string Name { get; set; }
}

public class CustomSerializer
{
     public T Serialize<T>(string data)
     {
             // Write the serialization code here.
     }
}

// This can be whatever attribute name you want. 
// You can then check if the property or class has this attribute using reflection.
public class ForceSpecialHandlingAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)