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




wcf serialization (2)

يمكن تحقيق هذا ، ولكن يجب تجاوز التسلسل الافتراضي عن طريق تطبيق السمة [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>

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

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

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


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

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

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





datacontract