سؤال

يحدد الجزء الثاني من مخطط XML أن مثيل نوع البيانات الذي تم تعريفه على أنه منطقي يمكن أن يحتوي على القيم الحرفية القانونية التالية {true, false, 1, 0}.XML التالي، على سبيل المثال، عند إلغاء التسلسل، يقوم بتعيين الخاصية المنطقية "محاكاة" إلى true.

<root>
    <emulate>1</emulate>
</root>

ومع ذلك، عندما أقوم بإجراء تسلسل للكائن مرة أخرى إلى XML، أحصل على true بدلا من القيمة العددية.سؤالي هو، هل هناك طريقة يمكنني من خلالها التحكم في التمثيل المنطقي في XML؟

هل كانت مفيدة؟

المحلول

يمكنك تنفيذ IXmlSerializable الذي سيسمح لك بتغيير الإخراج المتسلسل لفصلك كيفما تريد.سيستلزم ذلك إنشاء الطرق الثلاثة GetSchema() وReadXml(XmlReader r) وWriteXml(XmlWriter r).عند تطبيق الواجهة، يتم استدعاء هذه الأساليب بدلاً من محاولة إجراء تسلسل للكائن نفسه.

يمكن العثور على أمثلة على:

http://www.developerfusion.co.uk/show/4639/ و

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

نصائح أخرى

يمكنك أيضًا القيام بذلك عن طريق استخدام بعض سمات XmlSerializer للسحر الأسود:

[XmlIgnore]
public bool MyValue { get; set; }

/// <summary>Get a value purely for serialization purposes</summary>
[XmlElement("MyValue")]
public string MyValueSerialize
{
    get { return this.MyValue ? "1" : "0"; }
    set { this.MyValue = XmlConvert.ToBoolean(value); }
}

يمكنك أيضًا استخدام سمات أخرى لإخفاء هذا العضو من التحسس إذا أزعجك ذلك!إنه ليس حلاً مثاليًا، ولكنه يمكن أن يكون أسرع من تنفيذ IXmlSerializable.

لا، لا تستخدم System.Xml.XmlSerializer الافتراضي:ستحتاج إلى تغيير نوع البيانات إلى int لتحقيق ذلك، أو التلاعب بتوفير رمز التسلسل الخاص بك (ممكن، ولكن ليس كثيرًا من المرح).

ومع ذلك، يمكنك ببساطة إجراء معالجة لاحقة لملف XML الذي تم إنشاؤه بدلاً من ذلك، بالطبع، إما باستخدام XSLT، أو ببساطة باستخدام استبدال السلسلة.قليل من الاختراق، ولكنه سريع جدًا، سواء من حيث وقت التطوير أو وقت التشغيل...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top