C#JavaScriptSerializer序列化接口中不存在但原对象中存在的字段

时间:2019-03-19 10:23:41

标签: c# interface javascriptserializer

我正在尝试对没有某些字段的对象进行序列化。 我试图定义不带这些字段的接口,然后将其序列化。但是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, }

为什么?

1 个答案:

答案 0 :(得分:2)

这里的问题似乎是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