كيف يمكنني إضافة قيود نوع لتضمين أي شيء Serializable بطريقة عامة؟

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

سؤال

تحتاج الطريقة العامة إلى تسلسل الكائن الذي تم تمريره إليه، ولكن فقط أصر على أنها تنفذ Iserializable لا يبدو أنها تعمل. على سبيل المثال، لدي بنية يتم إرجاعها من خدمة ويب (تم وضع علامة عليها باستخدام Serializableattribute) التي تستسل إلى XML على ما يرام، ولكن، كما هو متوقع، يشكو برنامج التحويل البرمجي C #.

هل هناك طريقة يمكنني التحقق من الكائن غير قابل للتسلسل قبل محاولة تسلسلها، أو، أفضل ما زلت، طريقة لاستخدام where الكلمة الرئيسية للتحقق من الكائن مناسب؟

إليك طريقة كاملة:

public static void Push<T>(string url, T message)
        where T : ISerializable
{
    string xml = SerializeMessage(message);

    // Send the message to Amazon SQS
    SendMessageRequest sendReq = new SendMessageRequest { QueueUrl = url, MessageBody = xml };
    AmazonSQSClient client = new AmazonSQSClient(S3User, S3Pass);
    client.SendMessage(sendReq);
}

و serializemessage:

private static string SerializeMessage<T>(T message)
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
    using (StringWriter stringWriter = new StringWriter())
    {
        xmlSerializer.Serialize(stringWriter, message);
        return stringWriter.ToString();
    }
}

إذا لم يكن ذلك ممكنا، فما هي أفضل طريقة لأداء التحقق من وجود كائن قابل للتسلسل في وقت التشغيل؟

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

المحلول

لا يمكنك القيام بذلك تماما عبر القيود العامة، ولكن يمكنك القيام بأشياء بضع

1) ضع الجديد() القيد على النوع العام (لتمكين القدرة على التحمل ولضمان الشكوى Xmlserializer من عدم وجود نقص في الطاولة الافتراضية):

where T : new()

2) في السطر الأول من طريقتك من خلال التعامل مع التسلسل (أو المنشئ أو في أي مكان آخر، لا يتعين عليك تكراره مرارا وتكرارا)، يمكنك إجراء هذا الشيك:

if( !typeof(T).IsSerializable && !(typeof(ISerializable).IsAssignableFrom(typeof(T)) ) )
    throw new InvalidOperationException("A serializable Type is required");

بالطبع، لا يزال هناك إمكانية استثناءات وقت التشغيل عند محاولة تسلسل نوع، ولكن هذا سيغطي القضايا الأكثر وضوحا.

نصائح أخرى

كتبت مقالة بلوق طولها حول هذا الموضوع الذي قد تجده مفيدا. يذهب بشكل أساسي إلى التسلسل الثنائي ولكن المفاهيم تنطبق على معظم أي تنسيق التسلسل.

طويل وقصير منه هو

  • لا توجد طريقة لإضافة قيود عامة موثوقة
  • الطريقة الوحيدة للتحقق ومعرفة ما إذا كان كائن كنت Serializable هو تسلسلها ومعرفة ما إذا كانت العملية تنجح

الطريقة الوحيدة لمعرفة ما إذا كان كائن قابل للتسلسل هو محاولة تسلسله.

في الواقع، كنت تسأل كيفية معرفة ما إذا كان نوع "Serializable"، ولكن السؤال الفعلي سيكون فيما يتعلق بالكائنات. قد لا تكون بعض مثيلات من النوع قابلة للتسلسل حتى إذا تم وضع علامة على النوع [Serializable]. على سبيل المثال، ماذا لو كان المثيل يحتوي على مراجع دائرية؟

بدلا من

XMLSerializer XMLSerializer = NEW XMLSerializer (TypeOF (T))؛

يحاول

xmlserializer xmlserializer = new xmlserializer (message.gettype ())؛

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