给定这样的对象:
Foo foo = new Foo
{
A = "a",
B = "b",
C = "c",
D = "d"
};
如何仅序列化和反序列化某些属性(例如 A 和 D)。
Original:
{ A = "a", B = "b", C = "c", D = "d" }
Serialized:
{ A = "a", D = "d" }
Deserialized:
{ A = "a", B = null, C = null, D = "d" }
我使用 System.Web.Extensions.dll 中的 JavaScriptSerializer 编写了一些代码:
public string Serialize<T>(T obj, Func<T, object> filter)
{
return new JavaScriptSerializer().Serialize(filter(obj));
}
public T Deserialize<T>(string input)
{
return new JavaScriptSerializer().Deserialize<T>(input);
}
void Test()
{
var filter = new Func<Foo, object>(o => new { o.A, o.D });
string serialized = Serialize(foo, filter);
// {"A":"a","D":"d"}
Foo deserialized = Deserialize<Foo>(serialized);
// { A = "a", B = null, C = null, D = "d" }
}
但我希望解串器的工作方式有所不同:
Foo output = new Foo
{
A = "1",
B = "2",
C = "3",
D = "4"
};
Deserialize(output, serialized);
// { A = "a", B = "2", C = "3", D = "d" }
有什么想法吗?
此外,可能有一些更好的或现有的替代方案可用吗?
编辑:
有人建议使用属性来指定可序列化字段。我正在寻找更动态的解决方案。这样我就可以序列化 A、B,下次序列化 C、D。
编辑2:
任何序列化解决方案(JSON、XML、Binary、Yaml...)都可以。
最佳答案
非常简单 - 只需使用 [ScriptIgnore]
属性装饰您希望忽略的方法即可。
关于.net - 如何仅序列化某些对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/950211/