代码之家  ›  专栏  ›  技术社区  ›  Mars

分层DataContract不使用DataContractAttribute工作(直到混淆)

  •  0
  • Mars  · 技术社区  · 5 年前

    下面的分层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将变为空。*不能说什么混淆,对不起!

    代码分析没有警告。 我对编译器不是很熟悉,但我的猜测是:编译器可以识别意图并在内部建立链接,尽管没有 数据合同 属性。但是,它不会产生某种内部标记,因此模糊处理者可以随意混淆它,从而导致链接断开。如果这只是一块连续的记忆,我想事情会比现在更难打破,而不仅仅是变成 null

    数据合同 ClassInner 即使使用模糊处理也能解决问题!)

    0 回复  |  直到 5 年前
        1
  •  1
  •   nvoigt    5 年前

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

    不模糊,它可以在没有 [DataContract] 因为所发生的情况是,序列化程序将返回到不使用属性并仅通过属性名对其进行序列化。它们与您的属性相同,所以您不会注意到这一点。你应该可以通过给 [DataMember] 没有合适的 [数据合同] 另一个 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; }
    }
    

    [数据合同] 首先,序列化程序将返回到属性,只查找无法与输入匹配的随机字母组合。所以你会得到 null .