4

服务代码:

[ServiceContract]
    public interface IServices
    {
        [OperationContract]
        [XmlSerializerFormat]
        GetProductsResponse Getproducts(GetProductsRequest productsrequest);

    [OperationContract]
    SaveProductsResponse SaveProducts1(SaveProductsRequest1 productsrequest);
} 


public class GetProductsRequest
{
    [XMLElement]
    public string id;

    [XMLElement,typeof(Person)]
    public Person[] Persons;
}

[DataContract]
public class SaveProductsRequest1
{
    [DataMember]
    public List<Person> Persons;
}


[DataContract]
public class Person
{
    [DataMember]
    public int Id;

    [DataMember]
    public string Name;

    [DataMember]
    public Sex Sex;
}

[DataContract]
public enum Sex
{
    [EnumMember]
    Male,
    [EnumMember]
    Female
}

客户 :

ServicesClient client = new ServicesClient();
SaveProductsRequest1 req = new SaveProductsRequest1();
req.Persons = new List<Person> { new Person { Id = 10, Name = "Al", Sex = Sex.Female} }.ToArray();

client.SaveProducts1(req);

我能够在服务端获得值“Al”(字符串)。但是值 10 和 Male(值类型)在服务端被重置为默认值(0 和 Male)。

这只发生在当我将 XMLElement 用于任何数组属性和一个附加字符串属性时,我在服务合同(在本例中为 GetProducts)和我的 GetProducts 类中为我的任何一种方法设置了 XmlSerializerFormat。

WCF 运行时有问题吗?

4

3 回答 3

3

我已经使用您的服务器端代码设置了一个测试 WCF 服务,并使用您的示例客户端代码再次设置了一个测试客户端,它工作正常:

在此处输入图像描述

如您所见,1Person的所有 3 个值都完好无损地传输。如果您最后发生了一些不同的事情,它可能与您的配置文件中的配置选项有关,但从根本上说:代码有效。我正在使用 .NET 4.5 进行测试

于 2013-03-06T09:39:54.747 回答
0

仅当我在服务合同中的任何一种方法(在本例中为 GetProducts)具有 XmlSerializerFormat 时,才会发生这种情况。

在这种情况下,WCF 用于XmlSerializer序列化数据。因此既不[DataContract]也不[DataMember]适用。如果确实必须使用XmlSerializer,并且需要进一步控制 XML 序列化,则需要使用其特定属性,例如[XmlElement][XmlAttrribute][XmlIgnore]。明确的做法是一种很好的做法,以避免因无意重命名字段或属性而引起的难以发现的问题:

public class Person
{
    [XmlElement("Id")]
    public int Id { get; set; }

    [XmlElement("Name")]
    public string Name { get; set; }

    [XmlIgnore] // don't tell the stranger
    public Sex Sex { get; set; }
}

另请注意,[Serializable]属性与 XML 序列化和数据协定序列化无关。它仅二进制序列化有关。

于 2013-03-06T09:30:12.923 回答
0

您的服务合同是否装饰有以下ServiceContract属性:

[ServiceContract]
public interface IServices
{
    // ...
}

我只是希望你在这里没有向我们展示不同的东西。

于 2013-03-06T09:32:34.320 回答