【问题标题】:Serializing Objects with the DataContract/Data member for WCF使用 WCF 的 DataContract/Data 成员序列化对象
【发布时间】:2011-08-17 20:25:55
【问题描述】:

我正在尝试序列化我的数据层对象。这些是具有属性、方法和对象集合的复杂对象。

所有的类都继承自一个被序列化的基类。

    [DataContract]
    [KnownType(typeof(Person))]
    [KnownType(typeof(Client))]
    [KnownType(typeof(Professional))]
    [KnownType(typeof(ProfessionalApptHistory))]
    [KnownType(typeof(DailySchedule))]
    [KnownType(typeof(Option))]
    [KnownType(typeof(PersonType))]
    [KnownType(typeof(ProfessionClientInteractionType))]
    [KnownType(typeof(ProfessionalClientInteractions))]
    [KnownType(typeof(ProfessionalCalendar))]
    public abstract class CMBase
    {
        protected designs3_OurTimeEntities _entities = new designs3_OurTimeEntities();
        [DataMember()]
        public abstract bool IsPersisted { get; internal set; }
    }

我有一个 person 类,它也被序列化了

    [DataContract(Name = "Person")]
    [KnownType(typeof(Professional))]
    [KnownType(typeof(Client))]
    public abstract class Person : CMBase
    {
        [DataMember()]
        public int PersonId { get; internal set; }
        [DataMember()]
        public int PersonTypeId { get; set; }
        [DataMember()]
        public string Name { get; set; }
        [DataMember()]
        public string ContactNumber { get; set; }
        [DataMember()]
        public string ImageLocation { get; set; }
        [DataMember()]
        public Bitmap Image { get; internal set; }
        [DataMember()]
        public Guid MembershipUserId { get; internal set; }
        [DataMember()]
        public DateTime? ActivationStartDate { get; internal set; }
        [DataMember()]
        public string Email { get; internal set; }
        [DataMember()]
        public string Zip { get; set; }
        [DataMember()]
        public bool ShowDefaultPage { get; set; }
        [DataMember()]
        public bool IsClient { get; internal set; }

        [DataMember()]        
        public override bool IsPersisted
        {
            get
            {
                if (this.PersonId == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            internal set
            {
                throw new NotImplementedException();
            }
        }

... }

然后我有这个类不会被序列化

    [DataContract(Name = "Professional")]
    public class Professional : Person
    {
        [DataMember()]
        public DateTime DateStartedInProfession { get; set; }
        [DataMember()]
        public int? ShopId { get; set; }
        [DataMember()]
        public DateTime LastPayment { get; set; }
        [DataMember()]
        public DateTime NextPaymentDate { get; set; }
        [DataMember()]
        public DateTime TerminationDate { get; set; }
        [DataMember()]
        public int? Rating { get; internal set; }
        [DataMember()]
        public bool hasSystemAccess { get; internal set; }
        [DataMember()]
        public List<SaveResult> SaveResults { get; internal set; }
...
}

我还有其他没有序列化的类,我不明白发生了什么。

【问题讨论】:

    标签: c# .net wcf serialization


    【解决方案1】:

    看看Serialize a nullable int

    它有一些你可以遵循的方法。

    【讨论】:

      【解决方案2】:

      改变

      [DataMember()]
      public int? ShopId { get; set; }
      

      [DataMember()]
      public Nullable<int> ShopId { get; set; }
      

      我确定 Nullable get 已序列化,但我不能 100% 确定这是您唯一的问题。

      【讨论】:

      • 我改变了可以为空的类型,所以它们不再可以为空,所以它们读起来像这样 [DataMember()] public int ShopId { get;放; }。当我更新服务参考时,它仍然没有序列化。是不是基类继承有问题?
      • int? 是 Nullable 的语法糖,由编译器处理。序列化程序应该没有明显的差异。
      【解决方案3】:

      对于迟到的访客(就像我一样): 继承是问题所在,如下所述: Definiting the Serialization DataMember in Interface and then using it in a class implementing said interface

      如果Person 将是一个接口,而Profession 将实现该接口,那将起作用。这是因为属性DataMember 不能被继承。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        相关资源
        最近更新 更多