kullanarak boş xml öznitelik değerini nullable int özelliğine dönüştürerek 3. tarafa bir xml alıyorum ve C# nesnesine serpiştirmem gerekiyor. Bu xml, tamsayı türüne veya boş değere sahip öznitelikler içerebilir: attr = ”11” veya attr = ””. Bu öznitelik değerini nullable tamsayı türüyle mülke vermek istiyorum. Ancak XmlSerializer, seri hale getirmeyi nullable türlere dönüştürmez. Aşağıdaki sınama kodu InvalidOperationException ile XmlSerializer oluşturulurken başarısız olur {"TestConsoleApplication.SerializeMe" türünü yansıtan bir hata oluştu. "}. Ben int 'Değer' özelliğinin türünü değiştirdiğinizdeXmlSerializer
[XmlRoot("root")]
public class SerializeMe
{
[XmlElement("element")]
public Element Element { get; set; }
}
public class Element
{
[XmlAttribute("attr")]
public int? Value { get; set; }
}
class Program {
static void Main(string[] args) {
string xml = "<root><element attr=''>valE</element></root>";
var deserializer = new XmlSerializer(typeof(SerializeMe));
Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(xml));
var result = (SerializeMe)deserializer.Deserialize(xmlStream);
}
}
, seri kaldırma ınvalidoperationexception başarısız: XML belgesi (1, 16) içinde bir hata var
.
herkes tamsayı içine boş olmayan özellik değerini deserializing aynı anda (bir boş olarak) null türü içine boş özelliğin değeri serisini nasıl tavsiye? Bunun için herhangi bir hile var mı, bu yüzden her alanın seri hale getirilmesine gerek kalmayacak (aslında bunların çoğu var)?
Güncelleme ahsteele gelen yorum sonra:
-
olarak bildiğim kadarıyla
-
söz konusu özellik, XmlElementAttribute ile çalışır - bu özellik eleman hiçbir içeriğe sahip olduğunu belirtir, alt öğeleri veya vücudun olsun Metin. Ama XmlAttributeAttribute için çözüm bulmam gerekiyor. Her neyse, xml'yi değiştiremiyorum çünkü üzerinde hiçbir kontrolüm yok.
-
özellik değeri olmayan boş haldeyken veya özniteliği eksik olduğunda bu özellik çalışır. Attr boş değere (attr = '') sahip olduğunda XmlSerializer kurucusu (beklendiği gibi) başarısız olur.
Custom Nullable class like in this blog post by Alex Scordellis
public class Element { [XmlAttribute("attr")] public int Value { get; set; } [XmlIgnore] public bool ValueSpecified; }
Problemimin bu blog yayınında sınıf benimsemeye çalıştı:
Çirkin vekil çözüm kodlamak için kullanılamaz:
public class Element { [XmlAttribute("attr")] public string SetValue { get; set; } public int? GetValue() { if (string.IsNullOrEmpty(SetValue) || SetValue.Trim().Length <= 0) return null; int result; if (int.TryParse(SetValue, out result)) return result; return null; } }
Ama Don Bunun gibi bir çözüm bulmak istemiyorum çünkü tüketiciler için sınıfımın arayüzünü bozuyor. IXmlSerializable arabirimini elle uygularım.Ben bütün Eleman sınıf için IXmlSerializable uygulamak zorunda gibi
[XmlAttribute("attr")]
public NullableInt Value { get; set; }
Ama XmlSerializer yapıcı ınvalidoperationexception başarısız:
serileştirmez Can üyesi TestConsoleApplication.NullableInt türünün "Değeri".
XmlAttribute/xmlText (:) Burada bu kodu yazmış bana utanç) IXmlSerializable uygulayan türleri}
Şu görünüyor (Bu büyük) ve hiçbir basit bir çözüm ...
"Bir Nullable içine serisini XmlSerializer'ı kullanma" dönüşüm ile birlikte herhangi bir potansiyel null girdileri temsil link öldü . [İşte google'dan önbelleğe alınmış bir sürüm] (http://webcache.googleusercontent.com/search?q=cache:vT5GiyOCWyIJ:www.rqna.net/qna/zzrzt-deserialise-missing-xml-attribute-to-nullable-type .html) – Anttu
@Anttu Bağlantısını orijinalin Wayback Machine arşivi yanıtında değiştirdim. * Nml * içine seri hale getirmek için XmlSerializer'ı kullanma. –
ahsteele