使用datacontract序列化程序进行序列化时更改名称属性

时间:2016-04-18 19:14:42

标签: c# .net serialization datacontractserializer

我有一个名为RSummary的类,用于通过DataContractSerializer进行串行化。 它具有名为submitted和Saved的属性,它们是DInfo类的对象。 我在数据库中有xml格式的记录,类型为RSummary。 在序列化这些xml记录时,我在数据库中有一些xml记录(旧记录),这些记录使用来自命名空间ABC.Domain.Contract.Base的DInfo类和来自命名空间ABC.Common.Contract的一些记录(新记录)。

namespace ABC.Domain.Contract.Base
{
    public class RSummary
    {
        public Guid ID { get; set; }
        public DInfo Submitted { get; set; }
        public DInfo Saved { get; set; }
    }
}

namespace ABC.Domain.Contract.Base
{
   public class DInfo
   {
      public DateTime? Date { get; set; }
      public UserRef User { get; set; }

   }
}
namespace ABC.Common.Contract
{
   public class DInfo
   {
      public DateTime? Date { get; set; }
      public UserRef User { get; set; }

   }
}

我可以做些什么来使反序列化适用于两种类型的记录,即新旧记录。 我试过但没有运气

namespace ABC.Domain.Contract.Base
{
    public class RSummary
    {
        public Guid ID { get; set; }
        public ABC.Common.Contract.DInfo Submitted { get; set; }// new record should be parsed here
         [DataMember(Name = "Submitted")]
        public ABC.Domain.Contract.Base.DInfo SubmittedOld { get; set; }// old record should be parsed here
        public ABC.Common.Contract.DInfo Saved { get; set; }
         [DataMember(Name = "Saved")]
        public ABC.Domain.Contract.Base.DInfo SavedOld { get; set; }
    }
}

用于反序列化的代码是

public static T Deserialize<T>(string typeName, string data)
        {
            System.Diagnostics.Contracts.Contract.Requires(typeName != null);

            var type = Type.GetType(typeName);
            var ser = new DataContractSerializer(type, null, Int32.MaxValue, false, false, null, new SharedTypeResolver());
            var ms = new MemoryStream(Encoding.UTF8.GetBytes(data));
            ms.Seek(0, SeekOrigin.Begin);
            return (T)ser.ReadObject(ms);

        }

这里typeName是我们反序列化的对象类型,即RSummary

0 个答案:

没有答案