c# - 基元序列化

标签 c# serialization

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

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

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 */} 行。 Entries可以是原始类型或对象,这就是问题...

是否应该为每个需要的原始类型定义一个接口(interface)并将其实现为包装器?还是有更优雅的解决方案?

最佳答案

(具体问题看评论。)

Some values are only written if a certain condition is met.

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

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

It is not a static structure and contains some things like struct { int len; char[len]; }.

.Net 提供了多种序列化对象的方法,但我怀疑您想以定义的格式读/写,例如将字符串存储为长度后跟 8 位字符的格式。如果 .Net 机制不能满足您的要求,您可能必须自己编写。参见 Byte for byte serialization of a struct in C#有关这方面的更多信息,包括使用 Marshal 获取原语的底层字节。

另外,更多引用,如果你想避免写出原始类型,你可以使用public class Entry<T> where T: class .

关于c# - 基元序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14228221/

相关文章:

c# - DateTime.Today 和 "static readonly"

c# - 在 .NET 中使用 Go CD

c# - 如何在 C# 中读取 XML 属性?

c++ - 如何序列化对象以通过网络发送

c - 使用 OPENSSL 签名的结构序列化

jquery - 使用 JQuery SerializeArray 时合并相同命名的字段

string - 如何在scala中编写可读的字符串

c# - 如何通过 lambda 从列表中获取一种类型的 child ?

json - ModelSerializer 空字符串的字段验证

c# - ASP.NET : Redirect to another page from usercontrol in update panel