类设计:在域对象或助手类中序列化

dew*_*ald 5 c# oop serialization

假设我有一些域对象需要使用自定义二进制格式进行序列化/打包,以便它们可以通过套接字发送到外部进程。我的第一直觉是创建一个接口来表示可以打包成这种二进制格式的任何对象。

public interface IPackable
{
    byte[] Pack();
}
Run Code Online (Sandbox Code Playgroud)

然后我的域对象(如EntityStateVector,等)将分别实现这个接口。这类似于 .NET 和 Java 中默认序列化的工作方式。

public class Vector : IPackable
{
  public double X { get; set; }
  public double Y { get; set; }
  public double Z { get; set; }

  // other operators and methods...

  public byte[] Pack
  {
    MemoryStream stream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(stream);

    writer.Write(X);
    writer.Write(Y);
    writer.Write(Z);

    return stream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

然而,我对设计原则了解得越多(例如 SOLID 的单一职责原则),我就越认为我应该创建一个单独的类来打包我的域对象。

我可以看到两者的优点和缺点。大家怎么看?如果答案是创建一个单独的类来打包域对象,我是否应该为每个域对象创建一个单独的打包程序(例如EntityPackerStatePackerVectorPacker,等)?

谢谢

jhe*_*ngs 1

您是否也考虑过System.Runtime.Serialization命名空间?

创建外部序列化器的麻烦在于您必须将所有感兴趣的数据打开到另一个对象。由于对象的大部分状态可能保存在私有变量中,因此对象的公开属性不一定提供足够的信息来从外部完全描述它。

在坚持良好的数据封装的同时,我倾向于隐藏正在存储的对象中的打包/序列化的细节。