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




wcf serialization (3)

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

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

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


Answers

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

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

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


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

"هل سمات DataContract مطلوبة من أجل WCF"

من الناحية الفنية ، لا. هذا يعتمد على ما إذا كنت تستخدم DataContractSerializer أم لا (وهو الافتراضي على الارتباطات كثيرة).

هناك خيارات أخرى:

  1. فكر في مسلسلات بديلة
  2. جرّب استخدام بدائل عقود البيانات (لا تزال السمات مطلوبة في مكان ما ، ولكن هذا يعني أنه من الممكن أن تترك صفك دون تغيير ، إذا كان ذلك مناسبًا)
  3. اعتمد على افتراضات التسلسل عندما تقوم بتسلسل الطبقات بدون سمات "عقد البيانات"




c# xml wcf serialization datacontract