Сериализация объектов с помощью элемента DataContract / Data для WCF - PullRequest
2 голосов
/ 03 мая 2011

Я пытаюсь сериализовать свои объекты слоя данных.это сложные объекты, которые имеют свойства, методы и коллекции объектов.

Все классы наследуются от базового класса, который сериализуется.

    [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; }
...
}

У меня также есть другие классы, которые не сериализуются, и я не понимаю, что происходит.

Ответы [ 3 ]

1 голос
/ 24 июня 2013

Для поздних посетителей (как и я): Наследование является проблемой, как это обсуждается здесь: Определение DataMember сериализации в интерфейсе и последующее использование его в классе, реализующем указанный интерфейс

Если Person будет интерфейсом, а Profession будет реализовывать этот интерфейс, это будет работать. Это связано с тем, что атрибут DataMember не может быть унаследован.

1 голос
/ 03 мая 2011

Взгляните на Сериализуйте обнуляемый int

У него есть несколько подходов, которым вы могли бы следовать.

0 голосов
/ 03 мая 2011

Изменение

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

Для

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

Я уверен, что Nullable get сериализован, но я не уверен на 100%, что это твоя единственная проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...