基元的序列化

本文关键字:序列化 | 更新日期: 2023-09-27 17:51:07

我经常遇到这个问题,但我还没有找到令人满意的解决方案。

我正在为保存游戏实现一个阅读器(但它也可以应用于其他类型的文件(。根据版本的不同,会添加一些条目,但顺序始终保持不变。因此,我创建了一个类:

public class Entry<T> {
    public T Value;
    public readonly FileVersion MinVersion;
    public Entry(T v = default(T), ScenarioVersion m = FileVersion.V115) {
        Value = v;
        MinVersion = m;
    }
}

现在,你猜,我想用尽可能少的代码编写这些条目。我只想if (version >= MinVersion) { /* write data */ }写一次。条目可以是基元类型或对象,这就是问题所在...

应该定义一个接口并将其作为包装器为每个需要的基元类型实现吗?还是有更优雅的解决方案?

基元的序列化

(查看评论以了解特定问题。

某些值仅在满足特定条件时才写入。

这些条件在读取/写入文件时是否已知,或者在读取时,它们是否基于文件中的其他数据?如果是前者(已知(,则传入一个必须计算结果为 true 才能执行读取或写入操作的Func<bool>。调用方可以提供做出决策的适当委托或 lambda 方法。您在问题中提到了最低版本。我认为这是一个例子。

如果是后者(值是根据文件中的其他数据读取/写入的(,这是一个更广泛的问题。如果可以对文件前面或已知位置的数据做出决定,请加载它并将适当的参数传递到 Func 中。否则,您可能需要查看更复杂的解析机制,但我认为这不是您要问的。

它不是一个静态结构,包含一些类似结构的东西 { int len; char[len]; }。

.Net 提供了多种序列化对象的方法,但我怀疑您希望以定义的格式读取/写入,例如将字符串存储为长度后跟 8 位字符的格式。如果 .Net 机制不能执行所需的操作,则可能需要编写自己的机制。有关此内容的详细信息,包括使用 Marshal 获取基元的基础字节,请参阅 C# 中结构的字节序列化。

另外,更多供参考,如果你想避免写出基元类型,你可以使用 public class Entry<T> where T: class .