2

一部の属性が欠落している xml ドキュメントをデシリアライザーに渡しています。結果のオブジェクトで欠落している値を null にする必要がありますが、現在は ints をゼロにデシリアライズし、bools を false にします。

以下の例は、正しく逆シリアル化された vals を持つドキュメントを示していますが、vals のないドキュメントはゼロと null を返します。

このように欠落している属性を扱わないようにデシリアライザーを強制するにはどうすればよいですか。

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace SOQuestion
{
    class Program
    {
        static void Main(string[] args)
        {

            var resultWithVals = getObject(docWithVals());
            var resultWithoutVals = getObject(docWithoutVals());

            Console.WriteLine("WITH VALS");
            Console.WriteLine(resultWithVals.someBool);
            Console.WriteLine(resultWithVals.someFloat);
            Console.WriteLine(resultWithVals.someInt);
            Console.WriteLine(resultWithVals.someString);


            Console.WriteLine("WITHOUT VALS"); // nulls are returned here as zero and false
            Console.WriteLine(resultWithoutVals.someBool);
            Console.WriteLine(resultWithoutVals.someFloat);
            Console.WriteLine(resultWithoutVals.someInt);
            Console.WriteLine(resultWithoutVals.someString);

            Console.ReadLine();


        }

        public static XmlDocument docWithVals()
        {
            var doc = new XmlDocument();
            var el = (XmlElement)doc.AppendChild(doc.CreateElement("Result"));
            el.SetAttribute("someString", "Hello World");
            el.SetAttribute("someBool", "true");
            el.SetAttribute("someInt", "1");
            el.SetAttribute("someFloat", "1.1");
            return doc;

        }

        public static XmlDocument docWithoutVals()
        {
            var doc = new XmlDocument();
            var el = (XmlElement)doc.AppendChild(doc.CreateElement("Result"));
            el.SetAttribute("someString", "Hello World");
            return doc;

        }


        public static Result getObject(XmlDocument doc)
        {

                var mySerializer = new XmlSerializer(new Result().GetType());
                var myStream = new MemoryStream();
                doc.Save(myStream);
                myStream.Position = 0;
                var r = mySerializer.Deserialize(myStream);
                return (Result)r;
         }

    }

    [Serializable]
    public class Result
    {
        [XmlAttribute]
        public string someString { get; set; }
        [XmlAttribute]
        public bool someBool { get; set; }
        [XmlAttribute]
        public int someInt { get; set; }
        [XmlAttribute]
        public float someFloat { get; set; }

    }

}
4

4 に答える 4

2

を使用して、初期化DefaultValueAttributeされていないフィールドにデフォルト値を提供できます。あなたの場合、あなたは書くことができます

using System.ComponentModel;
using System.Configuration;

[XmlAttribute, DefaultValue(true)]
public bool someBool { get; set; }

編集。MSDNの MSND ページのメモを参照してください。

DefaultValueAttributeによって、メンバーが属性の値で自動的に初期化されることはありません。コードで初期値を設定する必要があります。

この問題は、c# での XML シリアライゼーションおよび DefaultValue("") 関連の問題でも解決されています。したがって、デフォルト値を設定するには、コードでこれらを指定する必要があります。


これが役立つことを願っています。

于 2012-11-06T13:01:52.613 に答える
0

ISerializable インターフェイスを実装し、GetObjectData メソッドを使用できます。

カスタムシリアル化を確認してください

于 2012-11-06T15:49:30.723 に答える
0

次のようなものを使用してみることができます:

    [XmlAttribute]
    public bool someBool { get; set; }
    [XmlIgnore]
    public bool someBoolSpecified { get; set; }
    [XmlIgnore]
    public bool? SomeBool
    {
        get
        {
            return someBoolSpecified ? someBool : default(bool?);
        }
        set
        {
            someBoolSpecified = value != default(bool?);
            someBool = value ?? default(bool);
        }
    }

XmlSerializerドキュメントに従って:

もう 1 つのオプションは、特別なパターンを使用して、XmlSerializer によって認識されるブール フィールドを作成し、XmlIgnoreAttribute をフィールドに適用することです。パターンは、propertyNameSpecified の形式で作成されます。たとえば、「MyFirstName」という名前のフィールドがある場合、「MyFirstName」という名前の XML 要素を生成するかどうかを XmlSerializer に指示する「MyFirstNameSpecified」という名前のフィールドも作成します。これを次の例に示します。

于 2012-11-06T18:03:02.680 に答える
0

ints およびfloats は null 値を持つことはできません。デフォルト値はそれぞれ0およびfalseです。

null を許可する必要がある場合は、null 許容型に変更します。

[Serializable]
public class Result
{
    [XmlAttribute]
    public string someString { get; set; }
    [XmlAttribute]
    public bool? someBool { get; set; }
    [XmlAttribute]
    public int? someInt { get; set; }
    [XmlAttribute]
    public float? someFloat { get; set; }
}

HasValueこのタイプを使用するものはすべて、これらのフィールドを使用する前に最初に null 値をチェックしたり、Valueプロパティで値にアクセスしたりする必要があることに注意してください。

于 2012-11-06T15:39:29.223 に答える