要素の1つに空白の属性があるxmlがあります。例:
<tests>
<test language="">
.....
</test>
</tests>
現在、言語はスキーマから作成されたクラスの列挙型です。言語が指定されている場合は正常に機能し、空白の場合は逆シリアル化に失敗します(例を参照)。
編集:逆シリアル化のコード:
XmlSerializer xmlserializer = new XmlSerializer(type);
StringReader strreader = new StringReader(stringXML);
Object o = serializer.Deserialize(strreader);
このシナリオをどのように処理できますか
Enumプロパティをnull許容として宣言できます。
public Language? Language { get; set; }
編集:わかりました、私はちょうど試しました、それは属性に対しては機能しません...ここに別のオプションがあります:このプロパティを直接シリアル化/逆シリアル化せず、代わりに文字列プロパティをシリアル化します:
[XmlIgnore]
public Language Language { get; set; }
[XmlAttribute("Language")]
public string LanguageAsString
{
get { return Language.ToString(); }
set
{
if (string.IsNullOrEmpty(value))
{
Language = default(Language);
}
else
{
Language = (Language)Enum.Parse(typeof(Language), value);
}
}
}
おそらく、列挙をマークアップし、不明を表すデフォルトのアイテムを追加する必要があります。
例えば:
Public Enum EmployeeStatus
<XmlEnum("")> Unknown = 0
<XmlEnum("Single")> One = 1
<XmlEnum("Double")> Two = 2
<XmlEnum("Triple")> Three = 3
End Enum
詳細については、 ここ を参照してください。
あなたはこのようにそれを行うことができます:
namespace Example
{
public enum Language
{
[XmlEnum("en")]
English,
[XmlEnum("de")]
Deutsch
}
public class ExampleClass
{
private Language? language;
[XmlAttribute("Language")]
public Language Language
{
get { return language ?? Example.Language.English; }
set { language = value; }
}
.
.
.
}
}
結果をどうしたいですか?
列挙型はNULL可能でない値型であるため、ブランク値をNULL参照にマップすることはできません。
object wontBeNull = couldBeNull ?? defaultIfNull;
私が試してみたいものです。 Null合体演算子 と呼ばれ、null入力のデフォルトが必要な場合に使用します。