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; }
}