我有一个类“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;
}
答案 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();