XmlSerializer i atrybuty dopuszczające wartość null


Mam klasę z wieloma właściwościami dopuszczającymi wartość Nullable & < T & >, które chcę serializować do XML jako atrybuty. Najwyraźniej nie, nie, ponieważ są one uważane za „typy złożone”. Zamiast więc implementować wzorzec * Specified, w którym tworzę dodatek * Value i właściwość * Specified w następujący sposób:

[XmlIgnore]
public int? Age
{
get { return this.age; }
set { this.age = value; }
}[XmlAttribute("Age")]
public int AgeValue
{
get { return this.age.Value; }
set { this.age = value; }
}[XmlIgnore]
public bool AgeValueSpecified
{
get { return this.age.HasValue; }
}Co działa świetnie - jeśli właściwość „Age” ma wartość, jest ona serializowana jako atrybut. Jeśli to nie ma znaczenia, nie jest serializowany.
Problem polega na tym, jak wspomniałem, w mojej klasie jest wiele wartości Nullable, a ten wzorzec po prostu sprawia, że ​​rzeczy stają się bałaganiarskie i niemożliwe do zarządzania.
Mam nadzieję, że istnieje sposób, aby Nullable był bardziej przyjazny dla XmlSerializer. Lub, w przeciwnym razie, sposób na utworzenie zastąpienia dopuszczającego wartość null, czyli.
Czy ktoś ma pomysł, jak mogłem to zrobić?
Podziękować.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem podobny problem z kodem, nad którym pracowałem, i zdecydowałem się po prostu użyć ciągu znaków dla właściwości, którą serializowałem i deserializowałem. Skończyło się na czymś takim:
[XmlAttribute("Age")]
public string Age
{
get
{
if (this.age.HasValue)
return this.age.Value.ToString();
else
return null;
}
set
{
if (value != null)
this.age = int.Parse(value);
else
this.age = null;
}
}[XmlIgnore]
public int? age;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zaimplementuj interfejs
IXmlSerializable
w swojej klasie. Następnie możesz obsługiwać przypadki specjalne, takie jak wartości null w metodach
ReadXML
i
WriteXML
.

Dobry przykład można znaleźć na stronie dokumentacji MSDN.
http://msdn.microsoft.com/en-u ... .aspx
.
class YourClass : IXmlSerializable
{
public int? Age
{
get { return this.age; }
set { this.age = value; }
}//OTHER CLASS STUFF// #region IXmlSerializable members
public void WriteXml (XmlWriter writer)
{
if( Age != null )
{
writer.WriteValue( Age )
}
} public void ReadXml (XmlReader reader)
{
Age = reader.ReadValue();
} public XmlSchema GetSchema()
{
return(null);
}
#endregion
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się