Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# DataContract在没有DataContractAttribute的情况下工作(直到混淆)_C#_.net_Obfuscation - Fatal编程技术网

C# DataContract在没有DataContractAttribute的情况下工作(直到混淆)

C# DataContract在没有DataContractAttribute的情况下工作(直到混淆),c#,.net,obfuscation,C#,.net,Obfuscation,我有以下由DataContract表示的分层JSON对象,我可以使用JavascriptSerializer [DataContract] public class ClassOuter{ [DataMember(Name = "stringProperty1")] public string stringProperty1 {get;set;} [DataMember(Name = "objectProperty")] public ClassInner ob

我有以下由
DataContract
表示的分层JSON对象,我可以使用
JavascriptSerializer

[DataContract]
public class ClassOuter{
    [DataMember(Name = "stringProperty1")]
    public string stringProperty1 {get;set;}

    [DataMember(Name = "objectProperty")]
    public ClassInner objectProperty {get;set;}
}

//NOTE:No DataContract Attribute here!
public class ClassInner{
    [DataMember(Name = "stringProperty2")]
    public string stringProperty2 {get;set;}
}
但是当我打电话的时候

string inputText = "{\"stringProperty1\":\"Hello\",\"objectProperty\":{\"stringProperty2\":\"World\"}}";
ClassOuter myObject = new JavascriptSerializer().Deserialize<ClassOuter>(inputText);
Console.WriteLine(myObject.stringProperty2);
string inputText=“{\'stringProperty1\”:\'Hello\”,\'objectProperty\:{\'stringProperty2\':\'World\'}”;
ClassOuter myObject=new JavascriptSerializer()。反序列化(inputText);
Console.WriteLine(myObject.stringProperty2);
一切正常

但是,在构建后通过模糊处理程序运行应用程序,stringProperty2将变为null*说不出什么困惑者,对不起

没有来自代码分析的警告。 我对编译器不是很熟悉,但我猜:编译器可以识别意图并在内部创建链接,尽管没有
DataContract
属性。但是,它不会进行某种内部标记,因此模糊器可以随意将其混淆,从而导致链接中断。如果它只是一块连续的内存,我猜事情会比它们更难打破,而不仅仅是变成
null

有人能证实或反驳我天真的假设吗

(为
ClassInner
添加
DataContract
属性可以解决此问题,即使使用了模糊处理!)

有人能证实或反驳我天真的假设吗

未经模糊处理,它将在没有
[DataContract]
的情况下工作,因为发生的情况是序列化程序将退回到不使用属性的状态,并仅通过属性名对其进行序列化。它们与您的属性相同,因此您不会注意到这一点。您应该能够验证,通过为没有正确的
[DataContract]
文本的
[DataMember]
提供另一个
名称
文本,序列化程序仍将使用属性名称并忽略该属性。这些属性成对工作。将两者都设置为“无”,或返回到“无”


因此,当您混淆它时,属性名称会更改。如果没有一个
[DataContract]
开始,序列化程序将退回到属性,只找到他无法与输入匹配的随机字母组合。因此,您将得到
null

。非常感谢你!
public class ClassInner
{
    // This is ignored because no [DataContract] was found
    [DataMember(Name = "nonexistentProperty")] 

    // This will still be set unobfuscated because the property name matches
    public string stringProperty2 { get; set; }
}