【问题标题】:Serialization of primitives原语的序列化
【发布时间】:2013-01-09 20:22:06
【问题描述】:

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

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

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 &gt;= MinVersion) { /* write data */ }。 Entries 可以是原始类型或对象,这就是问题所在......

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

【问题讨论】:

  • 原谅我的无知,但究竟是什么问题?原始类型可以在 C# 中序列化。如果您想对序列化进行更多控制,请查看stackoverflow.com/questions/628843/…
  • 我看不到如何解决以下两个问题:1.某些值仅在满足某个条件时才写入,2.它不是静态结构,包含struct { int len; char[len]; }之类的东西.
  • 目前还不清楚是什么问题。我会尝试回答,但问题中的一两个示例可能是最好的。

标签: c# serialization


【解决方案1】:

(具体问题看评论。)

某些值只有在满足特定条件时才会写入。

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

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

它不是一个静态结构,包含一些东西,比如 struct { int len;字符[len]; }。

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

另外,更多参考,如果你想避免写出原始类型,你可以使用public class Entry&lt;T&gt; where T: class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多