我经常遇到这个问题,但我还没有找到满意的解决方案。
我正在为存档游戏实现一个阅读器(但它也可以应用于其他类型的文件)。根据版本的不同,会添加一些条目,但顺序始终保持不变。因此我创建了一个类:
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/