您的位置:首页 > 移动开发 > Objective-C

使用 IExtensibleDataObject 进行往返式序列化

2011-10-23 13:27 363 查看
数据契约会随着时间的推移不断出现新的版本,结构相同但带有新增信息。与其将使用旧版本的数据契约的客户端与服务全部重新生成编译,不如让新版本向前兼容,使用共有部分的数据。

DataContractSerializer 正式这样处理的,如果消息中有多余的数据,DataContractSerializer会将其丢弃。 不过这样做在有些情况下会出现问题,如果数据被接受之后还要返还给客户端,那么忽略任何多余的数据都有可能造成信息的丢失。这正IExtensibleDataObject 接口要解决的问题,其提供了对数据契约使用未知外部数据的能力,在进行反序列化时,将任何未知的数据都存储在一个ExtensibleDataObject类的实例中。

DataContractSerializer 默认会忽略任何未被使用或期望的数据,除非在契约上实现了IExtensibleDataObject接口。

可以通过添加程序集的方式不生成代理类就共享数据契约,在这种情况下要确保数据契约实现了IExtensibleDataObject,否则将无法支持往返序列化

 

示例:

[DataContract]
public class Employee : IExtensibleDataObject
{
[DataMember]
public int EmployeeID { get; set; }

[DataMember]
public string FirstName { get; set; }

[DataMember]
public string LastName { get; set; }

[DataMember]
public string SSN { get; set; }

private ExtensionDataObject extensionData;

public ExtensionDataObject ExtensionData
{
get
{
return this.extensionData;
}
set
{
this.extensionData = value;
}
}
}


 

若使用svcutil生成代码,则会自动为客户端生成对应的实体,自动会继承Object,并实现IExtensionDataObject 接口。如:

using System.Runtime.Serialization;

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="Employee", Namespace="http://schemas.datacontract.org/2004/07/JerryShi.EssentialWCF")]
public partial class Employee : object, System.Runtime.Serialization.IExtensibleDataObject
{

private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

private int EmployeeIDField;

private string FirstNameField;

private string LastNameField;

public System.Runtime.Serialization.ExtensionDataObject ExtensionData
{
get
{
return this.extensionDataField;
}
set
{
this.extensionDataField = value;
}
}

[System.Runtime.Serialization.DataMemberAttribute()]
public int EmployeeID
{
get
{
return this.EmployeeIDField;
}
set
{
this.EmployeeIDField = value;
}
}

[System.Runtime.Serialization.DataMemberAttribute()]
public string FirstName
{
get
{
return this.FirstNameField;
}
set
{
this.FirstNameField = value;
}
}

[System.Runtime.Serialization.DataMemberAttribute()]
public string LastName
{
get
{
return this.LastNameField;
}
set
{
this.LastNameField = value;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐