- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我上过这样的课:
[DataContract(Namespace = "blah")]
public class Item
{
[DataMember(Order = 0)]
public int Index { get; set; }
[DataMember(Order = 1)]
public Uri ItemSource { get; set; }
[DataMember(Order = 2)]
public Uri ErrorSource { get; set; }
}
我有很多它的序列化副本(在文件中)(包括一些生产文件),现在我的任务是将此类更改为以下内容:
[DataContract(Namespace = "blah")]
public class Item
{
[DataMember(Order = 0)]
public int Index { get; set; }
[DataMember(Order = 1)]
public ItemSourcesCollection Sources { get; set; }
}
ItemSourcesCollection 在哪里
[CollectionDataContract(ItemName = "ItemSourceItem", Namespace = "blah")]
public class ItemSourcesCollection : List<ItemSource> {}
ItemSource 在哪里
[DataContract]
public class ItemSource
{
[DataMember]
public Uri SourcePath { get; set; }
[DataMember]
public ItemSourceType Type { get; set; }
}
ItemSourceType 在哪里
[Serializable]
public enum ItemSourceType
{
Data,
Errors
}
问题是向后兼容性。旧的序列化项目是否有可能被正确反序列化?迁移具有向后兼容性的数据协定的最佳实践/模式是什么?
最佳答案
是的,经过一些思考是可能的。我正在做以下事情以在反序列化期间手动检查以前的版本。
第一次使用IExtensibleDataObject对于 Item 类:
[DataContract(Namespace = "blah")]
public class Item : IExtensibleDataObject
{
[DataMember(Order = 0)]
public int Index { get; set; }
[DataMember(Order = 1)]
public ItemSourcesCollection Sources { get; set; }
}
现在是反序列化方法的棘手问题:
/// <summary>
/// The deserialized.
/// </summary>
/// <param name="context">
/// The streaming context.
/// </param>
[OnDeserialized]
private void Deserialized(StreamingContext context)
{
// reflection for backward compatibilty only
if (this.ExtensionData == null)
{
return;
}
IList members = this.CheckForExtensionDataMembers();
if (members == null)
{
return;
}
string value = this.GetExtensionDataMemberValue(members, "ItemSource");
// do something with value
value = this.GetExtensionDataMemberValue(members, "ErrorSource");
// do something with value
}
/// <summary>
/// The check for extension data members.
/// </summary>
/// <returns>
/// Thel list of extension data memebers.
/// </returns>
private IList CheckForExtensionDataMembers()
{
PropertyInfo membersProperty = typeof(ExtensionDataObject).GetProperty(
"Members", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
var members = (IList)membersProperty.GetValue(this.ExtensionData, null);
if (members == null || members.Count <= 0)
{
return null;
}
return members;
}
/// <summary>
/// The get extension data member value.
/// </summary>
/// <param name="members">
/// The members.
/// </param>
/// <param name="dataMemberName">
/// The data member name.
/// </param>
/// <returns>
/// Returns extension data member value.
/// </returns>
private string GetExtensionDataMemberValue(IList members, string dataMemberName)
{
string innerValue = null;
object member =
members.Cast<object>().FirstOrDefault(
m =>
((string)m.GetType().GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).GetValue(m, null)).Equals(
dataMemberName, StringComparison.InvariantCultureIgnoreCase));
if (member != null)
{
PropertyInfo valueProperty = member.GetType().GetProperty("Value", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
object value = valueProperty.GetValue(member, null);
PropertyInfo innerValueProperty = value.GetType().GetProperty("Value", BindingFlags.Public | BindingFlags.Instance | BindingFlags.Public);
object tmp = innerValueProperty.GetValue(value, null);
var s = tmp as string;
if (s != null)
{
innerValue = s;
}
}
return innerValue;
}
以上所有内容都将在 Item 类中。
关于c# - DataContract 向后兼容序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9992469/
是否有可能(如果可以,那么如何)从未实现 [DataContract] 的基类继承并告诉序列化程序忽略它? 有点像 //Non-accessible, non-[DataContract] class
问题是我没有得到我想要的 XML 结构。我的代码如下: [DataContract] public class Persons { [DataMember] public List P
下面是我的 WCF DataContract 基类 [DataContract] public class BaseClass { //some datamember
WCF 新手。 DataContact 类可以继承自 Interface 吗? 例如: [DataContract(Namespace = ...........)] public class Ves
我有一个令人沮丧的问题,我一直在努力克服但似乎无法弄清楚。 我有通过 WCF 中的 SOAP 和 REST 端点公开的服务。为了避免重复的对象代码,我想在两个服务之间重用契约(Contract)对象。
好吧,这里什么都没有。在阅读了服务版本控制和数据契约(Contract)版本控制的最佳实践 (http://msdn.microsoft.com/en-us/library/ms733832.aspx
我想知道通过 WCF 服务公开哪些对象有什么意义 - 我应该将 WCF 序列化规范添加到我的业务实体,还是应该实现一个转换器将我的业务实体映射到我想通过我的 WCF 公开的 DataContracts
[DataMember] public int? NumberOfPages; //////////// Is this supported???? [DataMember]
我有一个 ServiceContract,它有一个具有以下方法签名的 OperationContract:Manipulate(int fileid, param object[] Operation
我有一个类(带有属性和一些方法) [DataContract] public partial class AbstractApplicationCallDto { [IgnoreDataMem
我想使用 AJAX 调用来使用 WCF REST 服务。 假设我有以下内容 Person是一个用户定义的类: [ServiceContract] public interface IPerson {
我一直在阅读有关在我的 Silverlight 项目中有一个 [DataContract] 指定类的信息。我知道它们被序列化并传递给客户端以传递信息。 除此之外,您似乎可以在某些情况下向这些类添加代码
基本上我有一个 DataContract,其中包含一个 Dictionary: [DataContract] public class MyDictionary : IDictionary {
我上过这样的课: [DataContract(Namespace = "blah")] public class Item { [DataMember(Order = 0)] publ
我知道当你创建一个服务时你可以创建一个通用的 DataContract: [DataContract(Name = "Get{0}Request") public sealed class GetIt
我正在尝试将类 B 序列化为 ita 基类 A 的实例。 DataContractSerializer 不允许我这样做。 序列化失败的例子如下: class Program { [DataCo
我的数据最好被描述为“洋葱状”,因为每个外层都建立在它下面的一层之上。下面您将看到一个大大简化的版本(我的版本更深几层,但在每一层都表现出相同的行为)。 [CollectionDataContract
我正在设置 WCF 界面。我的数据契约(Contract)如下所示: [DataContract(Namespace = "wcf")] [KnownType(typeof(TypeFromLibra
我的数据最好被描述为“洋葱状”,因为每个外层都建立在它下面的一层之上。下面您将看到一个大大简化的版本(我的版本更深几层,但在每一层都表现出相同的行为)。 [CollectionDataContract
我不知道使用的是什么序列化程序,但在使用 datacontract 属性的 Name 属性时,我在序列化过程中看到了一些不一致的行为。 这是我正在做的一个例子: [XmlRoot(ElementNam
我是一名优秀的程序员,十分优秀!