【问题标题】:C# JavaScriptSerializer serialize fields that not exists in interface but do exists in original objectC# JavaScriptSerializer 序列化接口中不存在但在原始对象中存在的字段
【发布时间】:2019-03-19 10:23:40
【问题描述】:

我正在尝试序列化没有某些字段的对象。 我尝试定义没有这些字段的接口,然后对其进行转换和序列化,但JavaScriptSerializer 也包含这些字段。

interface iStam {
    public int a {
        get;
        set;
    }
}

class Stam :iStam{
    private int _a = 0;
    public int a {
        get {return _a;}
        set {_a = value;}
    }
    public int b = 0;
}


void fun() {
    Stam s = new Stam();
    /*
    s.a == 0;
    s.b == 0;
    */
    iStam _s = (iStam) s;
    /*
    _s.a == 0;
    _s.b Not exists!  compilation error.
    */

    JavaScriptSerializer jss = new JavaScriptSerializer ();
    Console.WriteLine(jss.Serialize(_s));
}

预期:

{
    "a":0
}

得到:

{
    "a":0,
    "b":0,
}

为什么?

【问题讨论】:

    标签: c# .net json interface javascriptserializer


    【解决方案1】:

    这里的问题似乎是JavaScriptSerializer.Serialize() 接受object 参数,而不是泛型类型,并且它根据其类签名而不是您转换到的接口来序列化对象。 JavaScriptSerializer 相当陈旧(可能已弃用),现在建议使用 Newtonsoft.Json 或其他序列化程序。

    但是,如果您别无选择,只能使用 JavaScriptSerializer,那么您可以使用 ScriptIgnore 属性注释您不想序列化的属性和字段。

    在课堂Stam:

    [ScriptIgnore]
    public int b = 0;
    

    像以前一样调用,但不需要强制转换:

    Stam s = new Stam();
    JavaScriptSerializer jss = new JavaScriptSerializer();
    Console.WriteLine(jss.Serialize(s));
    

    输出:

    {"a":0}
    

    如果您需要更大的灵活性,并且如果您不能迁移到更现代的序列化程序,那么您需要编写JavaScriptConverter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多