ile Object türünde özelliği seri hale getirmek nasıl bir özelliği vardır. Ama nesneyi bu özellik ile seri hale getirdiğimde, serileştirilmiyor. XmlSerializer'a olası tipler vermenin bir yolu var mı?XmlSerializer
cevap
Bunu önermiyoruz ama evet, bir üye için birden aday türleri hakkında gerçekleri anlatmak [XmlElement]
vb kullanabilirsiniz:
public class Test
{
private static void Main()
{
var ser = new XmlSerializer(typeof (Test));
var obj = new Test {Value = "abc"};
ser.Serialize(Console.Out, obj);
obj = new Test { Value = 123 };
ser.Serialize(Console.Out, obj);
obj = new Test { Value = 456.7F };
ser.Serialize(Console.Out, obj);
}
[XmlElement("a", Type = typeof(int))]
[XmlElement("b", Type = typeof(string))]
[XmlElement("c", Type = typeof(float))]
public object Value { get; set; }
}
çıkışının önemli bit (bütün xmlns
/<?xml>
görmezden vs) şunlardır:
<Test>
<b>abc</b>
</Test>
<Test>
<a>123</a>
</Test>
<Test>
<c>456.7</c>
</Test>
Mükemmel çalışıyor! – user919426
Bu, yalnızca elemanlar için farklı adlar veya ad alanları kullanmanız durumunda çalışır (bu örnekte a, b, c). Benim durumumda, her zaman aynı olması için eleman ismine ihtiyacım vardı, bu yüzden benim için işe yarayacak bir cevap gönderdim. – Evan
Ben bir unsur niteliği olarak nesne türünü yazma, IXmlSerializable
arabirimini uygulayan yaptı. Not: Kodda ad alanı ve ASCII kodlaması kullanmıyorum, bunlar zorunlu olmayan seçimlerdir.
HTH, Cabbi
Ayrıca nesne özelliği içeren sınıfa üzerinde [XmlInclude(typeof(YourType))]
kullanabilirsiniz. OP durumunda Yani, bu
[XmlInclude(typeof(PossibleClassOne))]
[XmlInclude(typeof(PossibleClassTwo))]
public class MyClass
{
public object Tag { get; set; }
}
Bu şekilde görünecektir, sen
Sana ISerializable uygulayan ve seri hale kontrol edebilecek beklediğiniz her durumda sizin öğe adı
<Tag>
tutabilir Nesne, türüne göre türüne göre etiketleme türüne göre değişir. Ancak, daha sonra nesneyi nasıl deserialize edeceğinizi bilmiyorum. Yazı tipi nesnelerini serileştirmek iyi bir fikir olmayabilir. –@Adrian 'XmlSerializer'' ISerializable' ile ilgilenmez; Bununla birlikte, bu senaryoyu en iyi şekilde kullanacağımızdan emin olduğumu kabul ediyorum –
@Marc XmlSerializer ISerialiable'ı önemsemiyor ancak IXmlSerializable'ı önemsiyor ve bunu uygulayan bir nesne üzerinde okuma ve yazma yöntemlerini çağırıyor. – Fen