2013-05-20 82 views
0

我使用asp.net mvc4网页API。我有由Devart实体开发产生了一些类和他们有以下结构:Asp.net MVC4的Web API XML序列化会忽略公共属性

[Serializable] 
[XmlRoot("Test")] 
[JsonObject(MemberSerialization.OptIn)] 
public class Test 
{ 
    [XmlAttribute("property1")] 
    [JsonProperty("property1")] 
    public int Property1 
    { 
     get { return _Property1; } 
     set 
     { 
      if (_Property1 != value) 
      { 
       _Property1 = value; 
      } 
     } 
    } 
    private int _Property1; 

    [XmlAttribute("property2")] 
    [JsonProperty("property2")] 
    public int Property2 
    { 
     get { return _Property2; } 
     set 
     { 
      if (_Property2 != value) 
      { 
       _Property2 = value; 
      } 
     } 
    } 
    private int _Property2; 
} 

我有这样的类测试控制器:

public class TestController : ApiController 
{ 
    private List<Test> _tests = new List<Test>() ; 

    public TestController() 
    { 
     _tests.Add(new Test() { Property1 = 1, Property2 = 2 }); 
     _tests.Add(new Test() { Property1 = 3, Property2 = 4 }); 
    } 

    public IEnumerable<Test> Get() 
    { 
     return _tests; 
    } 
} 

当我试图让JSON格式测试值就返回正确的响应:

"[{"property1":1,"property2":2},{"property1":3,"property2":4}]" 

但是当我使用XML格式将其序列不公开(Property1),但私人性质(即_Property1)和响应的样子:

<ArrayOfTest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TestProject.Models.Data"> 
    <Test> 
    <_Property1>1</_Property1> 
    <_Property2>2</_Property2> 
    </Test> 
    <Test> 
    <_Property1>3</_Property1> 
    <_Property2>4</_Property2> 
    </Test> 
</ArrayOfTest> 

UPD:我已经尝试添加[非序列化]和[XmlIgnore]私人性质,但在这样的XML输出是空的,只是:

<ArrayOfTest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/PeopleAirAPI.Models.Data"> 
    <Test/> 
    <Test/> 
</ArrayOfTest> 

的问题是如何强制XML serializator序列化公共属性。隐藏(忽略)私有属性不是问题。我不明白为什么它会序列化私有属性,我读过msdn文档和其他地方:

XML序列化只能序列化公用字段和属性。

为什么在这种情况下,它的行为违背了文档?

回答

5

的Web API使用的DataContractSerializer而不是XmlSerializer的默认情况下,它看起来在[Serializable],看着别的之前对其进行序列的所有领域。

它看起来像你的类型,设计使用XmlSerializer的序列化。我建议增加以下行:

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

这将确保所有的公共属性得到初始化,所有的XML序列化的属性,如[XmlAttribute]得到尊重。

+0

我试图添加类似[数据成员(NAME =“property1”)显示串行这些属性应该被序列化,但它没有帮助。你的解决方案与'config.Formatters'一起工作。 – m03geek

1

试图把[XmlIgnore]private long _Id;

+0

这是我试过的第一件事。这样的XML输出是空的:'' – m03geek

相关问题