2013-04-10 6 views
2

Я смотрю на Microsoft's How to: Create a Basic Data Contract for a Class or Structure, но это оставляет мне много вопросов.Основы DataContractAttribute

Они обеспечивают это очень упрощенный пример:

using System; 
using System.Runtime.Serialization; 

[DataContract] 
public class Person 
{ 
    // This member is serialized. 
    [DataMember] 
    internal string FullName; 

    // This is serialized even though it is private. 
    [DataMember] 
    private int Age; 

    // This is not serialized because the DataMemberAttribute 
    // has not been applied. 
    private string MailingAddress; 

    // This is not serialized, but the property is. 
    private string telephoneNumberValue; 

    [DataMember] 
    public string TelephoneNumber 
    { 
    get { return telephoneNumberValue; } 
    set { telephoneNumberValue = value; } 
    } 
} 

Для моего случая, мне это нужно также включать в себя другой объект пользовательского класса называется ADUser (пользователя Active Directory).

Я понимаю, что ADUser должен быть отмечен DataContractAttribute, но я не понимаю, как именно это можно сделать.

Вот класс Microsoft снова, но на этот раз с ADUser поля добавлен:

using System; 
using System.Runtime.Serialization; 

[DataContract] 
public class Person 
{ 
    // This member is serialized. 
    [DataMember] 
    internal string FullName; 

    // This is serialized even though it is private. 
    [DataMember] 
    private int Age; 

    // This is not serialized because the DataMemberAttribute 
    // has not been applied. 
    private string MailingAddress; 

    // This is not serialized, but the property is. 
    private string telephoneNumberValue; 

    [DataMember] 
    public string TelephoneNumber 
    { 
    get { return telephoneNumberValue; } 
    set { telephoneNumberValue = value; } 
    } 

    [DataMember] 
    public ADUser UserInfo { get; set; } 

} 

Я не очень понимаю, как и то, что все должно быть сделано для моего ADUser класса, но я уверен, что private вещи могут быть оставлены нетронутыми.

Как мне нужно исправить это ADUser класс пример?

public class ADUser 
{ 

    private string first, last, loginID; 

    public ADUser() { 
    first = null; 
    last = null; 
    loginID = null; 
    } 

    private void getInfo() { 
    // code goes here 
    // which sets loginID; 
    } 

    public void SetName(string first, string last) { 
    this.first = first; 
    this.last = last; 
    getInfo(); 
    } 

    public string LoginID { get { return loginID; } } 

} 
+2

Вы пытались просто поместить 'DataMember' в каждое поле в 'AdUser' и пометить' ADUser' 'DataContract'? – outcoldman

+1

как @outcoldman сказал, просто нужно сделать то же самое для ADUser. в принципе, каждый DataMember в DataContact должен быть сериализуемым, значит, если есть класс, он должен быть DataContact как weel. Кроме того, необходимо убедиться, что класс имеет конструктор, который не требует параметров –

+0

Это так просто? ОК! :) – jp2code

ответ

4

Как @outcoldman и @EthanLi предложил:

  1. Добавьте атрибут [DataContract]ADUser к классу.

  2. Добавить общественный конструктор без аргументов.

  3. Выберите поля, которые вы хотите пройти через WCF. Отметьте все их атрибутом [DataMember].

  4. Свойства только с добытчиками потерпит неудачу во время сериализации: все открытые свойства должны иметь как поглотителя и (публичный!) Сеттера. Так, например, ваше свойство LoginID потерпит неудачу, если вы попытаетесь применить к нему атрибут [DataMember]. В этом случае подумайте об изменении этого метода.

+0

Некоторые вещи, которые создает Microsoft, имеют '[ServiceContract]' с членами '[OperationContract]' и соответствующий '[DataContract]', который вместе с ними. Если мой ADUser не будет сервисом, мне тоже нужно включить его? – jp2code

+1

[ServiceContract] - это ваш сервис, [OperationContract] - ваши методы – evgenyl

+1

Этот ответ не совсем верный. Шаг № 2 не нужен. На шаге 4 (не совсем шаг, но любой) ни геттер, ни сеттер не должны быть «публичными».При использовании 'DataContractSerializer' (как это делает WCF) доступность игнорируется (' public' vs 'private'), и сериализатор не использует какой-либо конструктор при десериализации, поэтому не имеет значения, присутствует ли параметр без параметров. Обратите внимание, что это отличается от других сериализаторов, например. 'XmlSerializer'. –

Смежные вопросы