如何验证保存/加载系统的完整性

时间:2014-07-24 15:30:43

标签: c# reflection code-analysis

我正在为C#中的大型游戏项目制作一个保存/加载系统。

每个必须保存的类都会实现方法DoSnapshot()

在方法内部,程序员必须为类中的每个字段调用一个函数 - DoSnapshot(foo)如果foo应该保存,或Ignore(foo)如果不应该。

我有许多基本类型的DoSnapshot方法,如DoFloat,DoString以及复杂类型的版本。

我有100个课程,项目仍在开发中。

是否可以添加某种验证,即每个班级中的所有字段都用于Snapshot()Ignore()来电?省略字段会导致错误。 验证可以是运行时,也可以是编译时。我只想在开发过程中使用它,它不会发布给用户。

3 个答案:

答案 0 :(得分:1)

您可以向需要保存的字段添加属性,然后在DoSnapshot方法中遍历类中的每个属性。当该媒体资源具有您要查找的属性时,请拨打Snapshot,否则请拨打Ignore

public class SomeClass : SomeBaseClass
{
    [Required]
    public string Foo { get; set; }
    public string Bar { get; set; }

    public override void DoSnapshot()
    {
        var properties = this.GetType().GetProperties();
        foreach (var property in properties)
        {
            var isRequired = property.GetCustomAttributes(typeof (RequiredAttribute), false).Length > 0;
            if (isRequired)
            {
                // Something
            }
            else
            {
                // SomethingElse
            }
        }
    }
}

答案 1 :(得分:0)

你在做什么听起来很像standard .NET serialization/deserialization。您是否考虑过制作类型[Serializable] / ISerializable

某些规则定义了默认情况下将序列化的内容以及不会发生的内容,这意味着您不必手动考虑类型的每个属性和字段,而只需要考虑异常,即与这些标准规则不同的属性和字段。

(例如,无论如何,您都不必Snapshot()这些属性/字段,.NET序列化程序会默认选择序列化。您只需指定例外:Ignore可能会被[NonSerialized]替换。)


P.S。:正如您在评论中所述,您已经决定使用自己的机制而不是.NET序列化。尽管如此,从序列化中获取一个想法可能还为时不晚:convention over configuration

也就是说,您是否需要处理所有属性/字段,或仅处理异常情况,即那些偏离某些固定的预定义规则的属性?前者可以更容易地系统地检查完整的覆盖范围(例如,通过代码通过System.Reflection),后者可能会为您节省大量工作并使异常更加清晰。

答案 2 :(得分:0)

我要做的是创建一个属性和#34;标记"每个字段是否应该保存。然后,在运行时,我将使用反射查询该类以获取应序列化的所有字段:

public class RandomClass
{
    public string Foo { get; set; }
    [Ignore]
    public int Bar { get; set; }
}

public class IgnoreAttribute : Attribute
{

}

class Program
{
    static void Main(string[] args)
    {
        var properties = typeof(RandomClass).GetProperties()
                        .Where(prop => !prop.IsDefined(typeof(IgnoreAttribute), false));
        // Serialize all values
    }
}