序列化/反序列化对象的私有字段和autoproperties

时间:2014-12-09 17:51:13

标签: c# serialization

是否可以序列化对象的私有字段和autoproperties?

限制是我无法编辑需要序列化的类,这意味着: 1.我无法在成员上添加任何属性(有点数据) 2.我不能从接口继承它(有点Ixmlserializable) 4.为字段添加getter和setter属性 3.我需要序列化的根对象的类甚至没有标记为可序列化

由于

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);