Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试对象是否已使用构造函数中的标志进行反序列化_C# - Fatal编程技术网

C# 测试对象是否已使用构造函数中的标志进行反序列化

C# 测试对象是否已使用构造函数中的标志进行反序列化,c#,C#,我想看看是否有人能指出一些我不知道的用于此可序列化对象检查的愚蠢行为。我有一个运行在“插件”类型API中的对象,该API是序列化的。我的主机“插件”对象由API序列化,我将设置保存在包含我的设置的包装器对象中。这个对象是可序列化的,因此API将使用自己的存储机制保存和恢复我的状态,这允许我传递一个可序列化的对象,它将为我恢复 我需要能够在反序列化我的“插件”时测试我保存的设置是默认设置还是已反序列化。(API还使用了一些对象缓存,我将看到处理这个MySerializableSettings对象的

我想看看是否有人能指出一些我不知道的用于此可序列化对象检查的愚蠢行为。我有一个运行在“插件”类型API中的对象,该API是序列化的。我的主机“插件”对象由API序列化,我将设置保存在包含我的设置的包装器对象中。这个对象是可序列化的,因此API将使用自己的存储机制保存和恢复我的状态,这允许我传递一个可序列化的对象,它将为我恢复

我需要能够在反序列化我的“插件”时测试我保存的设置是默认设置还是已反序列化。(API还使用了一些对象缓存,我将看到处理这个MySerializableSettings对象的getter和setter的许多调用,所以我不能 成功地在该属性的get/set方法中进行了任何测试:这太令人困惑了。)


我在序列化对象中使用一个私有字段,它在实例初始值设定项中将字段设置为false,构造函数将其设置为true。序列化不会调用构造函数,因此,当我在“插件”中获得句柄时,如果字段为“false”,则我知道该对象已反序列化,并且不是由“插件”构造的默认对象

代码如下。有什么评论吗

[Serializable]
public class MySerializableSettings
{
    private bool atDefaults = false;


    /// <summary>
    /// Default constructor supports serialization. AtDefaults becomes true.
    /// </summary>
    public MySerializableSettings() {
        atDefaults = true;
    }


    /// <summary>
    /// A flag to test if this object has been de-serialized.
    /// This property defaults to false. All constructors set it to true.
    /// Therefore, if this property is false, this object was created
    /// without any constructor having been invoked (de-serialized).
    /// </summary>
    internal bool AtDefaults {
        get { return atDefaults; }
    }
}
[可序列化]
公共类MySerializableSettings
{
private bool atDefaults=false;
/// 
///默认构造函数支持序列化。默认值为true。
/// 
公共MySerializableSettings(){
atDefaults=true;
}
/// 
///用于测试此对象是否已反序列化的标志。
///此属性默认为false。所有构造函数都将其设置为true。
///因此,如果此属性为false,则创建此对象
///没有调用任何构造函数(反序列化)。
/// 
内部布尔值默认值{
获取{返回默认值;}
}
}

您可以添加一个用属性标记的方法。从msdn:

使用OnDeserializingAttribute在执行过程中设置默认值 反序列化

所以你的班级看起来像:

[Serializable]
public class MySerializableSettings
{
    private bool atDefaults = false;

    [OnDeserializing]
    public void OnDeserializing( StreamingContext context )
    {
        atDefaults = true;
    }

    internal bool AtDefaults {
        get { return atDefaults; }
    }
}

“序列化不会调用构造函数。”您认为在不使用构造函数的情况下如何创建对象?@clcto文档中说明构造函数不会运行。不幸的是,我认为默认构造函数正在运行:我现在遇到了一个断点,我的技巧不起作用。哈!我要试试这个!谢谢你:它看起来正是我想要的。我会在测试后发布结果。好吧,这似乎是正确的答案。但是,在我的代码中,没有调用该方法。我没有一个明确的答案,但在我运行的API的讨论板上,有人提到了同样的事情。因此,此API可能正在执行阻止此属性工作的操作。我现在也发现我的技巧也不可靠。我要找到另一种方法来满足我的总体需求。。。谢谢