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

DataContract works without DataContractAttribute (until obfuscation)

我有以下分层 JSON 对象,由 DataContract 表示,我可以使用 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 变为空。 *不能说什么混淆器,抱歉!

没有来自 CodeAnalysis 的警告。 我对编译器不太熟悉,但这是我的猜测:尽管没有 DataContract 属性,但编译器会识别意图并在内部生成 link 。但是,它不会进行某种内部标记,因此混淆器可以随意混淆它并中断 link。如果它只是一块连续的内存,我猜事情会比现在更难打破,而不仅仅是变成 null

任何人都可以验证或反驳我的幼稚假设吗?

(为 ClassInner 添加 DataContract 属性解决了问题,即使进行了混淆处理!)

Can anyone verify or dispute my naive hypothesis?

未混淆,它可以在没有 [DataContract] 的情况下工作,因为发生的事情是序列化程序将退回到不使用属性并仅通过 属性 名称对其进行序列化。它们与您的属性相同,因此您不会注意到这一点。您应该能够通过给没有正确 [DataContract][DataMember] 另一个 Name 文本来验证,序列化程序仍将使用 属性 名称并忽略该属性。这些属性成对工作。两者都设置或退回到 "none"。

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] 开头,序列化程序将回退到属性并仅找到他无法与输入匹配的随机字母组合。因此你会得到 null.