WCF SerializableAttribute DataContractAttribute XmlTypeAttribute инструмент xsd.exe

Я создал набор классов на основе набора соответствующих файлов * .xsd с помощью инструмента xsd.exe, как показано ниже:

xsd /c file1.xsd File2.xsd 

Один из сгенерированных классов показан ниже:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]

[System.SerializableAttribute()]   //please note here

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]

//please note here
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.xx.com/xx")]

public partial class SelfEmploymentTypePartner
{

    private string nameField;

    private SelfEmploymentTypePartnerAddress addressField;

    /// <remarks/>
    public string Name
    {
        get { return this.nameField; }
        set { this.nameField = value; }
    }

    /// <remarks/>
    public SelfEmploymentTypePartnerAddress Address
    {
        get { return this.addressField; }
        set { this.addressField = value; }
    }
}

Я хочу использовать все сгенерированные классы для WCF, нужно ли мне добавить DataContractAttribute и DataMemeberAttribute к классу и его членам? как показано ниже:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]

[System.SerializableAttribute()]    //please note here

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]

   //please note here
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, 
Namespace ="urn:corexx:Application")]

[DataContract(Name = "SelfEmploymentTypePartner")]  //please note here

public partial class SelfEmploymentTypePartner
{

    private string nameField;

    private SelfEmploymentTypePartnerAddress addressField;

    /// <remarks/>
    [DataMember]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }

    /// <remarks/>
    [DataMember]
    public SelfEmploymentTypePartnerAddress Address
    {
        get
        {
            return this.addressField;
        }
        set
        {
            this.addressField = value;
        }
    }
}

Поскольку в существующей действующей версии используется версия 1, если я изменю ее на версию 2, это сломает текущих пользователей?

Если мне нужно, есть ли простой способ сделать это. Потому что мне нужно отредактировать более тысячи строк кода.

Интерфейс ниже:

 [ServiceContract(SessionMode = SessionMode.Allowed, Namespace = "http://www.xxx.com" ,ProtectionLevel=ProtectionLevel.None)]
    [WsdlDocumentation("")]
    public interface IService
    {

        [OperationContract(ProtectionLevel= ProtectionLevel.None)]   //please note here
        [XmlSerializerFormat]   //please note here
        [FaultContract(typeof(ErrorDetailsStructure))]
        MyResponse GetInfo(RequestParameter parameter);

    }

Если для интерфейса используются и OperationContract, и XmlSerializerFormat, какой из них будет использоваться. Использует ли WCF XmlSerializer вместо DataContractSerializer?


person Pingpong    schedule 06.12.2011    source источник
comment
Не используйте xsd.exe, если вы хотите создавать контракты данных. Это часть старой технологии XML-сериализатора. Вместо этого используйте svcutil.exe.   -  person John Saunders    schedule 06.12.2011
comment
Спасибо! Есть ли веская причина использовать вместо этого svcutil.exe. Будет ли xsd.exe устаревшим? или svcutilexe будет лучше для WCF?   -  person Pingpong    schedule 07.12.2011
comment
svcutil.exe предназначен для WCF. Просто не используйте xsd.exe. устаревший - это юридический термин, но не используйте его, это правда.   -  person John Saunders    schedule 07.12.2011
comment
Большое тебе спасибо! Интересно, можете ли вы посмотреть ссылку о том, как использовать svcutil.exe. stackoverflow.com/questions/8407889/   -  person Pingpong    schedule 07.12.2011


Ответы (1)


Вам не нужно менять сгенерированный код. Вам нужно только сообщить WCF, что вы используете другой сериализатор в определении контракта службы:

[ServiceContract]
[XmlSerializerFormat]
public interface MyService
{
    [OperationContract]
    [XmlSerializerFormat]
    void MyMethod();
}

Однако вы должны прочитать плюсы и минусы использования DataContractSerializer и XmlSerializer.

person tom redfern    schedule 06.12.2011
comment
Насколько я знаю, этот атрибут необходим либо для типа, либо для метода, но избыточен для обоих. - person tsemer; 24.09.2013