c# - DataContract XML التسلسل وسمات XML




wcf serialization (2)

هل من الممكن إلغاء تسلسل XML هذا في كائن مميز بخاصية DataContract؟

<root>
<distance units="m">1000</distance>
</root>

كما قد ترى هناك سمة "الوحدات". لا أعتقد أن هذا مدعوم. أو انا مخطئ؟


يمكن تحقيق هذا ، ولكن يجب تجاوز التسلسل الافتراضي عن طريق تطبيق السمة [XmlSerializerFormat] إلى DataContract. على الرغم من أنه يمكن القيام به ، إلا أن هذا لا يعمل بشكل جيد مثل المُسلسل الافتراضي ، لذا استخدمه بحذر.

سوف تعطيك بنية الفئة التالية النتيجة التي كنت تتبعها:

using ...
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Xml.Serialization;

[DataContract]
[XmlSerializerFormat]
public class root
{
   public distance distance=new distance();
}

[DataContract]
public class distance
{
  [DataMember, XmlAttribute]
  public string units="m";

  [DataMember, XmlText]
  public int value=1000;
}

يمكنك اختبار هذا باستخدام الكود التالي:

root mc = new root();
XmlSerializer ser = new XmlSerializer(typeof(root));
StringWriter sw = new StringWriter();
ser.Serialize(sw, mc);
Console.WriteLine(sw.ToString());
Console.ReadKey();

سيكون الناتج:

<?xml version="1.0" encoding="utf-16"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <distance units="m">1000</distance>
</root>

لا يدعم Serializer "عقد البيانات" المستخدم بشكل افتراضي في WCF سمات XML لأسباب تتعلق بالأداء (يكون DCS أسرع بنسبة 10٪ في المتوسط ​​من برنامج تشغيل XML).

لذا ، إذا كنت تريد استخدام DCS حقًا ، فلا يمكنك استخدام هذه البنية لديك - يجب تغييرها.

أو تحتاج إلى استخدام XmlSerializer مع WCF ، كما أظهر جريج في إجابته - التي تعمل أيضًا ، ولكنك تفقد فائدة الأداء (بالإضافة إلى جميع المزايا الأخرى) لـ DCS.





datacontract