0

我正在使用 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
}
4

2 回答 2

0

根据您的序列化项目列表,我假设 Item 类还包含一个 Source 属性,例如:

public class Item {
    public int ID;
    public String Name;
    public bool Active;
    public Source Source;
}

如果是这种情况,您可以将 XmlIgnore 属性添加到 Source 属性,然后将源的 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)。

于 2012-08-05T01:39:17.540 回答
0

此处发布的 [JsonIgnore] 建议是一个很好的建议,但它仅适用于 JSON.NET 序列化。

要以通用方式执行此操作,请添加对System.Runtime.Serialization DLL 的引用并相应地装饰您的模型:

[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}
于 2012-08-05T08:31:30.970 回答