我有一个用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
属性也解决了这个问题,即使混淆了!)
答案 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]
。