साथ प्रकार वस्तु की संपत्ति को क्रमानुसार कैसे मैं एक संपत्ति है। लेकिन जब मैं इस संपत्ति के साथ वस्तु को क्रमबद्ध करता हूं, तो इसे क्रमबद्ध नहीं किया जाता है। क्या संभव प्रकार के साथ XmlSerializer को निर्देश देने का कोई तरीका है?XmlSerializer
उत्तर
मैं इस अनुशंसा नहीं करते हैं, लेकिन हाँ, आप [XmlElement]
आदि का उपयोग कर सकते एक सदस्य के लिए कई उम्मीदवार प्रकार के बारे में यह बताने के लिए:
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; }
}
उत्पादन के महत्वपूर्ण बिट्स (अनदेखी सभी xmlns
/<?xml>
आदि) हैं:
<Test>
<b>abc</b>
</Test>
<Test>
<a>123</a>
</Test>
<Test>
<c>456.7</c>
</Test>
पूरी तरह से काम करता है! – user919426
यह केवल तभी काम करता है जब आप तत्वों के लिए अलग-अलग नामों या नामस्थानों का उपयोग करते हैं (हालांकि, इस उदाहरण में ए, बी, सी)। मेरे मामले में, मुझे तत्व नाम की हमेशा आवश्यकता होती है, इसलिए मैंने एक उत्तर पोस्ट किया जो मेरे लिए काम करना प्रतीत होता था। – Evan
मैं इसे IXmlSerializable
इंटरफेस को लागू करने, एक तत्व विशेषता के रूप में ऑब्जेक्ट प्रकार लेखन किया था।
public void ReadXml(XmlReader reader)
{
reader.MoveToContent();
Boolean isEmptyElement = reader.IsEmptyElement;
reader.ReadStartElement();
if (!isEmptyElement)
{
// ...here comes all other properties deserialization
object tag;
if (ReadXmlObjectProperty(reader, "Tag", out tag))
{
Tag = tag;
}
reader.ReadEndElement();
}
}
public void WriteXml(XmlWriter writer)
{
// ...here comes all other properties serialization
WriteXmlObjectProperty(writer, "Tag", Tag);
}
public static bool ReadXmlObjectProperty(XmlReader reader,
string name,
out object value)
{
value = null;
// Moves to the element
while (!reader.IsStartElement(name))
{
return false;
}
// Get the serialized type
string typeName = reader.GetAttribute("Type");
Boolean isEmptyElement = reader.IsEmptyElement;
reader.ReadStartElement();
if (!isEmptyElement)
{
Type type = Type.GetType(typeName);
if (type != null)
{
// Deserialize it
XmlSerializer serializer = new XmlSerializer(type);
value = serializer.Deserialize(reader);
}
else
{
// Type not found within this namespace: get the raw string!
string xmlTypeName = typeName.Substring(typeName.LastIndexOf('.')+1);
value = reader.ReadElementString(xmlTypeName);
}
reader.ReadEndElement();
}
return true;
}
public static void WriteXmlObjectProperty(XmlWriter writer,
string name,
object value)
{
if (value != null)
{
Type valueType = value.GetType();
writer.WriteStartElement(name);
writer.WriteAttributeString("Type", valueType.FullName);
writer.WriteRaw(ToXmlString(value, valueType));
writer.WriteFullEndElement();
}
}
public static string ToXmlString(object item, Type type)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.ASCII;
settings.Indent = true;
settings.OmitXmlDeclaration = true;
settings.NamespaceHandling = NamespaceHandling.OmitDuplicates;
using(StringWriter textWriter = new StringWriter())
using(XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
{
XmlSerializer serializer = new XmlSerializer(type);
serializer.Serialize(xmlWriter, item, new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }));
return textWriter.ToString();
}
}
नोट: कोड मैं कोई नाम स्थान और ASCII एन्कोडिंग का उपयोग में, उन गैर अनिवार्य विकल्प हैं।
HTH, Cabbi
तुम भी वर्ग उस वस्तु प्रॉपर्टी वाला पर [XmlInclude(typeof(YourType))]
उपयोग कर सकते हैं। ओपी के मामले में इसलिए, यह इस
[XmlInclude(typeof(PossibleClassOne))]
[XmlInclude(typeof(PossibleClassTwo))]
public class MyClass
{
public object Tag { get; set; }
}
इस तरह की तरह लग रहे हैं, तो आप सभी मामलों में अपने तत्व नाम <Tag>
रख सकते
- 1. XmlSerializer
- 2. XmlSerializer
- 3. XmlSerializer
- 4. XmlSerializer
- 5. XmlSerializer
- 6. XmlSerializer
- 7. XmlSerializer
- 8. XmlSerializer
- 9. एंड्रॉइड XmlSerializer
- 10. मैं XMLSerializer
- 11. .net XmlSerializer
- 12. XmlSerializer निर्माता
- 13. XmlSerializer सत्यापन
- 14. XMLSerializer XElement
- 15. XmlSerializer IENumerable
- 16. XmlSerializer sgen
- 17. XmlSerializer प्रॉपर्टी कनवर्टर
- 18. सी # XmlSerializer BindingFailure
- 19. XmlSerializer और एम्बेडेड व्हाइटस्पेस
- 20. .NET के XmlSerializer
- 21. क्या XmlSerializer और BinaryFormatter
- 22. XmlSerializer। एक्सएमएल अज्ञात नोड
- 23. XmlSerializer UTF-8 एन्कोडिंग
- 24. XmlSerializer और nullable विशेषताएँ
- 25. XmlSerializer, "विनिर्दिष्ट" प्रत्यय और IReflect
- 26. System.InvalidOperationException: XmlSerializer विशेषता System.Xml.Serialization.XmlChoiceIdentifierAttribute आइटम
- 27. XmlSerializer प्रदर्शन जारी जब XmlRootAttribute
- 28. XmlSerializer। शून्य स्ट्रिंग गुण रखें?
- 29. XmlSerializer सूची आइटम तत्व नाम
- 30. () XmlSerializer के साथ यह serializing
मैं तुम्हें ISerializable लागू करने और की क्रमबद्धता को नियंत्रित कर सकता है उम्मीद थी ऑब्जेक्ट को इसके क्रमबद्ध प्रकार में कास्ट करके टैग के प्रकार के आधार पर ऑब्जेक्ट करें। हालांकि मुझे नहीं पता कि आप ऑब्जेक्ट को बाद में कैसे deserialize करेंगे। टाइप ऑब्जेक्ट की चीजों को क्रमबद्ध करने के लिए संभवतः एक अच्छा विचार नहीं है। –
@Adrian 'XmlSerializer' को 'ISerializable' की परवाह नहीं है; हालांकि, मैं इस बात से सहमत हूं कि स्पष्ट रूप से यह परिदृश्य सबसे अच्छा है –
@Marc XmlSerializer को ISERialiable के बारे में परवाह नहीं है, हालांकि यह IXmlSerializable के बारे में परवाह करता है और इसे लागू करने वाले ऑब्जेक्ट पर पढ़ने और लिखने के तरीकों को कॉल करेगा। – Fen