是否可以序列化对象的私有字段和autoproperties?
限制是我无法编辑需要序列化的类,这意味着: 1.我无法在成员上添加任何属性(有点数据) 2.我不能从接口继承它(有点Ixmlserializable) 4.为字段添加getter和setter属性 3.我需要序列化的根对象的类甚至没有标记为可序列化
由于
答案 0 :(得分:1)
你可能会做这样的事情(如果你有像集合或非序列化字段这样的东西,你必须得到更多的创意,但你明白了):
var dict = new Dictionary<string, object>();
foreach (var field in typeof(Foo).GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
{
dict[field.Name] = field.GetValue(f);
}
string json = JsonConvert.SerializeObject(dict);
基本上,你一次一个地翻录这些字段,将它们转储到字典中,然后序列化字典。
答案 1 :(得分:1)
如果您不想自己使用反射,可以阅读此article并附上序列化解决方案列表。
答案 2 :(得分:0)
您可以重写DefaultContractResolver以仅对字段进行反序列化,而不必修饰类:
public class FieldsOnlyContractResolver: DefaultContractResolver
{
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
return objectType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
.Cast<MemberInfo>().ToList();
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
return base.CreateProperty(member, MemberSerialization.Fields);
}
}
然后,要使用它,请在JsonConvert内部指定。(De)SerializeObject:
var jsonSettings = new JsonSerializerSettings() {
ContractResolver = new FieldsOnlyContractResolver()
};
var json = JsonConvert.SerializeObject(obj, jsonSettings);
var objAgain = JsonConvert.DeserializeObject<ObjType>(json, jsonSettings);