سؤال

قضيت جزءا جيدا من الوقت في الأسبوع الماضي يعمل على التسلسل. خلال ذلك الوقت، وجدت العديد من الأمثلة التي تستخدم إما binaryformatter أو xmlserializer. لسوء الحظ، ما لم أجده كان أي أمثلة تفصل بشكل شامل الاختلافات بين الاثنين.

تكمن سفر التكوين من فضولي في سبب قدرة BinaryFormatter على التحمل مباشرة إلى واجهة مع وجود Xmlserializer. جون skeet. في إجابة "صب إلى متعددة (أنواع غير معروفة) في وقت التشغيل"يوفر مثالا على التسلسل الثنائي المباشر إلى واجهة. ستان ر. قدمت لي وسيلة إنجاز هدفي باستخدام Xmlserializer في إجابته "XML كائن التحيز للواجهة."

بما يتجاوز واضح من BinaryFormatter يستخدم التسلسل الثنائي أثناء استخدام XMLSerializer XML أود أن أفهم أكثر اكتمالا الاختلافات الأساسية. متى تستخدم واحد أو آخر وإيجابيات وسلبيات كل منها.

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

المحلول

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

يسقط Serializer XML على السخط الآخر فقط إلى مخطط ولا يسقط فقط الحقول العامة وقيم الكائن وليس من النوع معلومات أخرى إذن (مثل واجهات تنفذ النوع).

هنا هو وظيفة جيدة، .NET التسلسل, ، مقارنة binaryformatter., soapformatter., ، و Xmlserializer.. وبعد أوصي بإلقاء نظرة على الجدول التالي مما يلي بالإضافة إلى Serializers المذكورة سابقا dataconctractrializer., netdataconctractserializer. و protobuf-net..

Serialization Comparison

نصائح أخرى

فقط لوزن في ...

الفرق الواضح بين الاثنين هو "ثنائي مقابل XML"، لكنه يذهب أعمق بكثير من ذلك:

  • مجالات (BinaryFormatter= BF) مقابل عامة الأعضاء (عادة الخصائص) (XmlSerializer= XS)
  • Type-Metadata مقرها (BF) مقابل العقود (XS)
  • النسخة الهشة (BF) vs التسامح (XS)
  • "الرسم البياني" (BF) مقابل "شجرة" (XS)
  • .NET محددة (BF) VS المحمولة (XS)
  • Opaque (BF) مقابل الإنسان قابلة للقراءة (XS)

كمناقشة لماذا BinaryFormatter يمكن أن تكون هشة، انظر هنا.

من المستحيل مناقشة أي أكبر؛ كل نوع البيانات الوصفية في BinaryFormatter يمكن أن تجعلها أكبر. و XmlSerializer يمكن أن تعمل جدا مع ضغط مثل gzip.

ومع ذلك، فمن الممكن أن تأخذ نقاط القوة لكل منها؛ على سبيل المثال، تلقيت Google بتنسيق تسلسل البيانات الخاص به، "المخازن المؤقتة البروتوكول". هذا هو:

  • عقد مقرها
  • المحمولة (انظر قائمة التطبيقات)
  • النسخة المتسامحة
  • شجرة مقرها
  • Opaque (على الرغم من وجود أدوات لإظهار البيانات عند دمجها مع .proto)
  • عادة "العقد أولا"، لكن بعض التطبيقات تسمح بالعقود الضمنية بناء على انعكاس

ولكن الأهم من ذلك، إنها بيانات كثيفة للغاية (لا توجد بيانات تعريف من النوع الأول، والتمثيل الثنائي النقي، والعلامات القصيرة، والحيل مثل ترميز قاعدة الطول 7 البديل)، وكفاءة للغاية لمعالجة (لا توجد بنية XML معقدة، لا توجد سلاسل لمطابقة الأعضاء، إلخ ).

قد أكون متحيزا قليلا. احتفظ بأحد التطبيقات (بما في ذلك العديد من المناسبة ل C # /. Net)، ولكن عليك أن تلاحظ أنني لم أرتبط أي تنفيذ محدد التنسيق يقف تحت أساسية خاصة به ؛-P

تنتج Serializer XML XML وأيضا مخطط XML (ضمنيا). سينتج XML الذي يتوافق مع هذا المخطط.

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

تسلسل وقت التشغيل (الذي BinaryFormatter هو جزء من) تسلسل أنواع .NET الفعلية إلى الجانب الآخر، لذلك إذا قمت بإرسال List<int>, ، الجانب الآخر سيحصل على List<int>.

من الواضح أن يعمل بشكل أفضل إذا كان الجانب الآخر قيد التشغيل.

يقوم XMLSerializer بتسليح النوع من خلال قراءة جميع خصائص الكتابة التي تحتوي على كل من Getter العام و Serveal (وأيضا أيضا أي حقول عامة). في هذا المعنى، تسلسل xmlserializer / deserializes "العرض العام" للمثيل.

الصياغة الثنائية، على النقيض من ذلك، تسلسل نوعا من خلال تسلسل "Internal" للمثيل، أي حقوله. سيتم تسلسل أي حقول غير ملحوظة ك [Nonserialized] إلى الدفق الثنائي. يجب تمييز النوع نفسه على أنه [Serializable] كما يجب أن يتم أيضا أي حقول داخلية متسلسلة أيضا.

أعتقد أن واحدة من أهم تلك هي أن التسلسل الثنائي يمكن أن تسلسل كل من الأعضاء العام والخاص، في حين أن الآخر يعمل فقط مع الوزارات العامة فقط.

هنا، يوفر مقارنة مفيدة للغاية بين هذين النوعين من حيث الحجم. إنها مشكلة مهمة للغاية، لأنك قد ترسل كائن المسلح إلى جهاز بعيد.

http://www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-verse-xml-serialization-size/

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