ما هو التسلسل الأكثر مرونة لكائنات .NET، مع سهولة تنفيذه؟

StackOverflow https://stackoverflow.com/questions/106599

سؤال

أرغب في إجراء تسلسل للكائنات وإلغاء تسلسلها دون الحاجة إلى القلق بشأن الرسم البياني للفصل بأكمله.

المرونة هي المفتاح.أود أن أكون قادرًا على إجراء تسلسل لأي كائن تم تمريره إلي دون السمات الكاملة المطلوبة خلال الرسم البياني للكائن بأكمله.

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

لقد وجدت مشاكل في استخدام DataContract وJSON وXML Serializers.

  • يبدو أن معظم هذه الأخطاء تتمحور حول تسلسل القوائم/القواميس (أي تسلسل القوائم/القواميس). قاموس XML العام القابل للتسلسل).
  • "أضف أي أنواع غير معروفة بشكل ثابت لقائمة الأنواع المعروفة - على سبيل المثال ، باستخدام سمة المعروفة أو عن طريق إضافتها إلى قائمة الأنواع المعروفة التي تم تمريرها إلى DatacontractSerializer."

يرجى بناء إجاباتك على التجارب الفعلية وليس النظرية أو قراءة المقال.

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

المحلول

هل فكرت في إجراء تسلسل إلى JSON بدلاً من XML؟

Json.NET يحتوي على مُسلسل قوي ومرن حقًا ولا يواجه أي مشاكل مع Hashtables/القواميس العامة ولا يتطلب أي سمات معينة.أعرف ذلك لأنني كتبته :)

يمنحك قدرًا كبيرًا من التحكم من خلال خيارات متنوعة في المُسلسِل ويسمح لك بتجاوز كيفية إجراء تسلسل للنوع عن طريق إنشاء JsonConverter له.

في رأيي، JSON أكثر قابلية للقراءة من قبل الإنسان مقارنة بـ XML وJson.NET يعطي خيار كتابة JSON منسق بشكل جيد.

أخيرًا، المشروع مفتوح المصدر حتى تتمكن من الدخول إلى الكود وإجراء التعديلات إذا كنت بحاجة إلى ذلك.

نصائح أخرى

إذا كنت أتذكر أنه يعمل بشيء من هذا القبيل مع خاصية:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }

إذا قمت بتسلسل هذا فستحصل على شيء مثل:

<Foo>
    <Bar />
    <Bar />
</Foo>

وبطبيعة الحال، ربما ينبغي لي أن أحيل إلى الخبراء.إليك المزيد من المعلومات من MS: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

اسمحوا لي أن أعرف إذا كان هذا يناسبك.

من متطلباتك يبدو أن تسلسل Xml هو الأفضل.

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

يعد IntermediateSerializer في XNA Framework رائعًا جدًا.يمكنك العثور على مجموعة من البرامج التعليمية حول استخدامه على http://blogs.msdn.com/shawnhar

عملت عملية تسلسل SOAP بشكل جيد بالنسبة لي، حتى بالنسبة للكائنات التي لم يتم وضع علامة [Serializable] عليها.

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

ضع كافة الفئات التي تريد إجراء تسلسل لها في تجميع منفصل، ثم استخدم أداة sgen لإنشاء تجميع تسلسل لإجراء تسلسل إلى XML.استخدم سمات XML للتحكم في التسلسل.

إذا كنت بحاجة إلى تخصيص مجموعة التسلسل (وأنت سوف تحتاج إلى ذلك لدعم الفئات غير القابلة لـ IXmlSerializable والفئات التي تحتوي على عقد مجردة)، ثم قم بتوجيه sgen لتفريغ التعليمات البرمجية المصدر في ملف منفصل ثم إضافته إلى الحل الخاص بك.ومن ثم يمكنك تعديله حسب الضرورة.

http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

FWIW، لقد تمكنت من إجراء تسلسل لإطار عمل AdsML بالكامل (أكثر من 400 فئة) باستخدام هذه التقنية.لقد تطلب الأمر الكثير من التخصيص اليدوي، لكن لا يمكن الالتفاف حول ذلك إذا أخذت في الاعتبار حجم إطار العمل.(لقد استخدمت أداة منفصلة للانتقال من XSD إلى C#)

أوافق على أن طرق التسلسل المستندة إلى DataContract (إلى JSON وXML وما إلى ذلك) أكثر تعقيدًا مما أريد.

إذا كنت تحاول الحصول على تسجيل JSON http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

إنه جزء من امتدادات MS AJAX.من المسلم به أنه تم وضع علامة عليه على أنه قديم في .NET 3.5 ولكن يذكر ScottGu في تعليق مدونته هنا (http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx#4301973) أنه ليس متأكدًا من السبب ويجب دعمه لفترة أطول قليلاً.

إن أبسط ما يمكنك فعله هو وضع علامة على الكائنات الخاصة بك باستخدام السمة القابلة للتسلسل ثم استخدام المنسق الثنائي للتعامل مع التسلسل.لا ينبغي أن يمثل الرسم البياني للفئة بأكملها مشكلة بشرط أن يتم أيضًا وضع علامة على أي كائنات مضمنة على أنها قابلة للتسلسل.

ربما يكون الطريق الأكثر فعالية هو إجراء تسلسل باستخدام BinaryFormatter

كما نسخت من http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename,
                  ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize =
         (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}

من أجل قابلية التشغيل البيني، استخدمنا دائمًا تسلسل Xml وتأكدنا من تصميم فصلنا من الألف إلى الياء للقيام بذلك بشكل صحيح.

نقوم بإنشاء مستند مخطط XSD وإنشاء مجموعة من الفئات باستخدام XSD.exe.يؤدي هذا إلى إنشاء فئات جزئية لذلك نقوم بعد ذلك بإنشاء مجموعة من الفئات الجزئية المقابلة لإضافة الأساليب الإضافية التي نريدها لمساعدتنا في ملء الفئات واستخدامها في تطبيقنا (حيث أنها تركز على التسلسل وإلغاء التسلسل ويصعب استخدامها أحيانًا ).

يجب عليك استخدام NetDataContractSerializer.وهو يغطي أي نوع من الرسوم البيانية للكائنات ويدعم الأنواع العامة والقوائم وتعدد الأشكال (ليست هناك حاجة إلى سمة KnownType هنا) والتكرار وما إلى ذلك.العيب الوحيد هو أنه يتعين عليك وضع علامة على جميع فصولك بسمات [Serializable] / [DataContract]، لكن التجربة تظهر أنه يتعين عليك القيام بنوع من الضبط اليدوي على أي حال لأنه لا ينبغي استمرار جميع الأعضاء.كما أنه يتم إجراء تسلسل له في ملف Xml، على الرغم من أن إمكانية قراءته أمر مشكوك فيه.

كانت لدينا نفس متطلباتك واخترنا هذا الحل.

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