4

XML にシリアル化する一連のオブジェクトがあります。これらのオブジェクトは階層にまとめられ、1 つのオブジェクトのプロパティに多くのサブオブジェクトがあり、これらのオブジェクトにもサブオブジェクトがある、などです。

オブジェクトを含むプロパティが、オブジェクトに<tag />シリアル化するプロパティがなかったという理由だけでシリアル化されてしまう場合 (デフォルト値が含まれているため)、そのタグも消えてしまいたいのですが、できませんそれを行う方法は言うまでもなく、これが可能かどうかを調べているようです。

以下にLINQPadプログラムを投稿します。

<?xml version="1.0" encoding="utf-16"?>
<root>
  <child />
</root>

ダンプしたいもの:

<?xml version="1.0" encoding="utf-16"?>
<root />

つまり、childタグが空になってしまったので、削除してほしい。

これは可能ですか?もしそうなら、どのように?

ブール型の名前のプロパティを追加して、プロパティがシリアル化される場合XYZSpecifiedに返されることを十分に認識していることに注意してください。私は基本的に、これらのタグが空だったのでXMLからそれらのタグを削除することにより、シリアライザーにこれを自分で理解させることができるかどうかを尋ねています。trueXYZ

XmlElementAttributeこれを達成するために何らかの方法で属性を変更できますか? XYZSpecifiedそれとも、オブジェクトがシリアル化される結果となるものがオブジェクトに含まれているかどうかを確認するために、すべての付随するロジックを使用してプロパティを追加するルートを実際に実行する必要がありますか?

LINQPadプログラムは次のとおりです。

void Main()
{
    var root = new Root();
    root.Child = new Child();

    var serializer = new XmlSerializer(typeof(Root));
    var ns = new XmlSerializerNamespaces();
    ns.Add(string.Empty, string.Empty);
    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, root, ns);
        writer.ToString().Dump();
    }
}

[XmlType("root")]
public class Root
{
//    [XmlIgnore]
//    public bool ChildSpecified { get { return Child != null && Child.HasValues; } }

    [XmlElement("child")]
    public Child Child { get; set; }
}

public class Child
{
//    [XmlIgnore]
//    public bool HasValues { get { return !string.IsNullOrWhiteSpace(Name); } }

    [XmlElement("name")]
    [DefaultValue(null)]
    public string Name { get; set; }
}

コメントアウトされたコードをプログラムに追加し直すと、目的が達成されますが、実際のプロジェクトでは子オブジェクトに多くのプロパティがあり、それらのプロパティの一部にはプロパティ自体を持つオブジェクトが含まれているため、次のようになります。メンテナンスの悪夢とバグのレシピ。XML シリアライザーがこれを自分で判断できるように説得できるのであれば、そのほうがよいでしょう。

4

1 に答える 1