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