5

これを逆シリアル化したいと仮定しましょう(物事を簡単にするために名前空間を削除しました):

<TextField>
  <Caption>Location</Caption>
  <Name>Location</Name>
</TextField>

TextFieldはFormFieldを継承しているため、FormFieldのクラス定義では次のようになります。

[KnownType(typeof(TextField))]
[DataContract(Name = "FormField"]
public abstract class FormField
{
    [DataMember]
    public string Name { get; set; }
}

TextFieldクラスは次のようになります。

[DataContract(Name = "TextField")]
public class TextField : FormField
{
    [DataMember]
    public string Caption { get; set; }
}

これを使用して逆シリアル化を試みました:

internal static FormField Deserialize(string xml)
{
    var serializer = new DataContractSerializer(typeof(FormField)});
    using (var backing = new StringReader(xml))
    {
        using (var reader = new XmlTextReader(backing))
        {
            return serializer.ReadObject(reader) as FormField;
        }
    }
}

SerializationExceptionが発生します:「要素'FormField'を期待しています...」

4

2 に答える 2

0

あなたのモデルはこのように見えるべきではありませんか?

public abstract class TextField: FormField
{
    [DataMember]
    public string Name { get; set; }
}

ちょっと突き刺しただけで、私は実際にDataContractSerializerのスタッフリストに奇妙なことに飛び込み始めました。

于 2011-02-24T18:37:02.340 に答える
0

私の問題を解決するために、XMLにコンテナノードを追加して、次のようにしました。

<FormFieldContainer>
    <TextField>   
        <Caption>Location</Caption>
        <Name>Location</Name>
    </TextField>
</FormFieldContainer>

私はこのクラスを作成しました:

[DataContract(Name = "FormFieldContainer")]
internal class FormFieldContainer
{
    [DataMember]
    internal FormField FormField { get; set; }
}

そして、私の逆シリアル化メソッドは次のようになります。

    internal static FormField Deserialize(string xml)
    {
        var serializer = new DataContractSerializer(typeof(FormFieldContainer));
        using (var backing = new StringReader(xml))
        {
            using (var reader = new XmlTextReader(backing))
            {
                return ((FormFieldContainer)serializer.ReadObject(reader)).FormField;
            }
        }
    }

誰かがより良い解決策を持っているなら、それを共有してください:)

于 2011-02-25T10:29:55.197 に答える