我正在使用MVC 4 Web API,遇到了一个无法找到答案的序列化问题。关于代码。。。
假设我有以下类:
public class Item {
public int ID;
public String Name;
public bool Active;
}
public class Source {
public int ID;
public int Name;
}
项目的序列化列表看起来像:
{
ID: 1,
Name: "That big thing",
Active: true,
Source: {
ID: 1,
Name: "The street"
}
}
如果我的列表中有很多项,那么将每个源序列化为一个对象的效率会很低。我只想在列表中获取源ID。类似于:
{
ID: 1,
Name: "That big thing",
Active: true,
Source: 1
}
根据您序列化的项目列表,我假设Item类还包含一个Source属性,类似于:
public class Item {
public int ID;
public String Name;
public bool Active;
public Source Source;
}
如果是这种情况,您可以向Source属性添加XmlIgnore属性,然后将源的id公开为新的SourceID属性:
public class Item
{
public int ID;
public String Name;
public bool Active;
[XmlIgnore]
public Source Source;
[XmlElement("Source")]
public int SourceID
{
get
{
if (Source != null)
{
return Source.ID;
}
else
{
return 0;
}
}
set
{
// ignore incoming values
}
}
}
json库可能不支持Xml属性;如果是这种情况,您可以使用其相应的属性(即JsonIgnore、JsonProperty)。
这里发布的[JsonIgnore]建议很好,但它只适用于JSON.NET序列化。
要以通用方式执行此操作,请添加对System.Runtime.SerializationDLL的引用,并相应地装饰您的模型:
[DataContract]
public class Source
{
[DataMember]
public int ID;
public int Name;
}
这将省略您在Web API中使用的任何MediaTypeFormatting中的Name属性,即
<Active>true</Active>
<ID>1</ID>
<Name>test</Name>
<Source>
<ID>1</ID>
</Source>
或
"ID":1,
"Name":"test",
"Active":true,
"Source":{"ID":1}