如何在反序列化后保留基类字段值?

时间:2017-04-24 23:03:12

标签: c# .net wcf deserialization

我有一个类“Employee”,它继承自抽象基类“Person”。我在客户端中序列化Employee类并将其发送到处理Employee记录的wcf服务并返回Employee对象。

但是我们有这个奇怪的要求,因为服务端的Employee类不是从“Person”继承的,而Employee只是一个实体。出于这个原因,我在客户端中将Person的所有字段标记为“NonSerialized()”(我不想将不必要的字段发送到wcf服务)。

在客户端中,我想将Employee json对象反序列化为现有的Employee类(继承自Person),但是我想在不丢失Employee对象中抽象基类“Person”的现有字段值的情况下执行此操作。

反序列化员工json对象后,我成功获取了Employee对象的所有值,但“Person”类的所有现有字段都变为null。我使用Microsoft的“DataContractJsonSerializer”进行反序列化。任何帮助表示赞赏。

以下是客户端中的代码:

//Creating employee initializes fields of Person class to some values    
var employee = new Employee();

//Code here to call WCF and get response back
DeserializeResponse(out employee, jsonResponse);


private TContract DeserializeResponse<TContract>(out TContract dataContract, string jsonResponse)
            where TContract : class, new()
        {     
            var jsonSerializer = new DataContractJsonSerializer(typeof(TContract));
            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(response)))
            {
//employee loses all the Person values after deserialization here
                dataContract = jsonSerializer.ReadObject(ms) as TContract;
            }       
            return dataContract;
        }

1 个答案:

答案 0 :(得分:0)

您的Employee课程是.NET中的reference type。设置dataContract = jsonSerializer.ReadObject(ms) as TContract;将更改dataContract所持有的引用,指向新的内存位置。那时你的旧物体已经消失了。

更好的选择可能是在SetPersonDefaults基类上有一个Person方法,您可以在构造函数中调用它,也可以在反序列化后在employee对象上调用数据

//Creating employee initializes fields of Person class to some values    
var employee = new Employee();

//Code here to call WCF and get response back
DeserializeResponse(out employee, jsonResponse);

employee.SetPersonDefaults();