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 に答える