DataContract在没有DataContractAttribute的情况下有效(直到混淆)

时间:2019-03-05 00:46:00

标签: c# .net obfuscation

我有一个用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);

一切正常。

但是,在构建后通过混淆器运行应用程序时,stringProperty2变为null。 *不能说什么混淆器,对不起!

CodeAnalysis没有警告。 我对编译器不是很熟悉,但这是我的猜测:尽管没有DataContract属性,编译器仍可以识别意图并在内部进行链接。但是,它不会进行某种内部标记,因此混淆器可以随意将其弄乱,并且链接会断开。但是,如果这只是一块连续的内存块,我想事情将比它们更难以打破,而不仅仅是变成null

有人可以验证或质疑我的天真的假设吗?

((为DataContract添加ClassInner属性也解决了这个问题,即使混淆了!)

1 个答案:

答案 0 :(得分:1)

  

有人可以验证或质疑我的天真的假设吗?

没有混淆,它将在没有[DataContract]的情况下工作,因为发生的事情是序列化器将退回到不使用属性的状态,而仅通过属性名称对其进行序列化。它们与您的属性相同,因此您不会注意到这一点。您应该能够通过给没有正确[DataMember]的{​​{1}}加上另一个[DataContract]文本来验证,序列化程序仍将使用属性名称而忽略该属性。这些属性是一对的。设置两者或退回到“无”。

Name

因此,当您对其进行混淆时,属性名称会更改。如果没有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; } } 开头,则序列化程序将退回到属性,仅找到他不能与输入匹配的随机字母组合。因此,您将获得[DataContract]