C# / المتوسط: التركيب والعمل غير المتزامن / الدرس 11
الإدخال والإخراج والتسلسل المحدود
افصل النقل والترميز والصياغة والمجال والتخلص في حد بيانات موثوق.
في هذه الصفحة
أهداف الدرس
- معالجة القراءات الجزئية والطول الدقيق.
- تحديد سياسات الحجم والنص وJSON.
- حفظ ملكية الدفق عبر الأعمار غير المتزامنة والتحليل.
قراءة الدفق ليست سجلا كاملا
قد تعيد Read وReadAsync أقل من المطلوب دون اكتمال سجل التطبيق. يدل الصفر لطلب غير فارغ عادة على النهاية وفق العقد. استخدم ReadExactly للطول الثابت أوحالة تحليل تدريجي ولا تقرأ ما لم يملأ. تحدد نتيجة القراءة أي جزء من المخزن حديث الصلاحية، ولا يجعل حجم المصفوفة باقيها بيانات سجل.
يقرأ المثال ثلاثة من دفق ذاكرة ويترك الرابع دون ملفات. افحص أقصى طول خارجي قبل التخصيص وحد عدد السجلات والعمل، فالكثير الصغير قد يستنفد الموارد. تظل حدود عدد الإطارات والعمل التراكمي لازمة حتى لو كان كل إطار تحت أقصى حجمه.
using System;
using System.IO;
using System.Text;
using var input = new MemoryStream(Encoding.ASCII.GetBytes("ABCD"));
byte[] record = new byte[3];
input.ReadExactly(record);
Console.WriteLine($"record={Encoding.ASCII.GetString(record)} remaining={input.Length - input.Position}");
record=ABC remaining=1
تملأ ReadExactly الأحرف ABC وتترك بايتا اصطناعيا واحدا.
الترميز وسياسة السطر صريحان
لا يحدد الدفق ترميز نصه. اختر Encoding وسياسة المعيب وعلامة البداية والأسطر والحجم. تلائم القراءة الكاملة حجما مبررا فقط وقد يخصص قارئ السطر سطرا ضخما دون حد. قد يكون رفض الترميز المعيب مطلب بروتوكول، بينما تسمح سياسة أخرى بالاستبدال؛ لا تترك الاختيار غير مرئي.
يعد طول النص وحدات UTF-16 بعد الفك فلا يتبادل حد البايت وحد النص. تحتاج المعرفات Ordinal وتنسيقا ثابتا، وقد يحتاج العرض ثقافة محلية. افصل التحليل والعرض لمنع تغير التنسيق بثقافة الجهاز. اختبر التنسيق مع ثقافات مختلفة عندما يكون للاختبار علاقة بمدخل مستخدم أو ملف يجب نقله بين الأجهزة.
فحص سجل JSON اصطناعي محدود
يفك المثال كائن JSON صغيرا معروفا ويفحص وجوده ومجال كميته بمكتبة المنصة دون شبكة أوحزمة. حد المدخل قبل الفك وقرر المجهول والوجود؛ لا يعني النجاح صحة العمل. لا ينشئ نجاح Deserialize تفويضا ولا يؤكد أن كل خاصية قدمها المدخل؛ يلزم فحص الشكل والمعنى.
قد يعطي الحقل العددي الغائب صفرا لا يتميز من الصريح. استخدم nullable أوrequired أوسياسة مخطط للوجود. إعداد التسلسل والتسمية قرارات توافق تختبر ببيانات ثابتة. قد يغير تبديل إعداد أسماء الخصائص أو الحقول المجهولة توافق ملفات سبق نشرها، فيستحق اختبارا مستقلا.
using System;
using System.Text.Json;
Order? order = JsonSerializer.Deserialize<Order>("""{"Quantity":3}""");
if (order is null || order.Quantity < 0 || order.Quantity > 100)
{
throw new InvalidOperationException("invalid order");
}
Console.WriteLine($"quantity={order.Quantity}");
internal sealed class Order
{
public int Quantity { get; set; }
}
quantity=3
يحوي السجل ثلاثة وهي ضمن المجال المعلن من صفر إلى مئة.
إبقاء المورد حيا حتى الاستهلاك
يجب أن تغطي using القراءة والانتظار والاجتياز الفعلي. عودة مهمة أومجتاز يصل لاحقا لدفق ميت عيب عمر. تغلق مغلفات الأصل افتراضيا؛ اختر leaveOpen عندما يملكه الخارج. لا ينقل Stream المستعار التخلص تلقائيا. يجب أن يكون آخر استخدام فعلي سابقا للإغلاق، لا مجرد آخر سطر في الطريقة التي أطلقت القراءة.
افحص الكتابة والتفريغ والتخلص عند التسليم. لا يعني التسلسل في مخزن حفظ ملف دائما. يعتمد الاستبدال ومقاومة الانهيار على النظام، فلا يدعي المسلسل ضمانهما دون بروتوكول. عندما تتطلب العملية ديمومة ملف فوثق بروتوكول التخزين المنصي بدلا من نسبته إلى نجاح التسلسل وحده.
اختبار الناقص والزائد عمدا
افصل الجلب والصياغة ومدى التمثيل والمجال وارفض اللاحق عند طلب سجل واحد. لا تسجل حمولة سرية أوغير موثوقة كاملة لفشل التحليل؛ أبلغ موضعا أوفئة واحفظ الداخلي للمخول. يساعد مصدر يعيد أجزاء صغيرة على كشف افتراضات مخفية لا يكشفها MemoryStream سريع في كل اختبار.
اختبر الفراغ والحد وزيادة بايت والثنائي المبتور والترميز المعيب وJSON null والحقول والمجال. استخدم دفقات أجزاء صغيرة لإثبات عدم افتراض الامتلاء وافحص التنظيف والحالة بعد الرفض. على رفض المدخل ألا يعتمد حالة جزئية أو يسرب payload حساسا في رسالة تشخيص غير مقيدة.
الأخطاء الشائعة وإصلاحها
يحوي السجل بايتات قديمة بعد قراءة قصيرة.
- لماذا يحدث؟
- افتُرض ملء Read الكامل.
- كيف تصلحه؟
- عالج العدد أواستخدم طولاً دقيقا مبررا.
- كيف تتجنب تكراره؟
- اختبر دفق بايت لكل قراءة.
يقبل فك JSON الناجح طلبا خاطئا.
- لماذا يحدث؟
- اختلطت الصياغة بالمجال.
- كيف تصلحه؟
- افحص الوجود والمدى والمطلوب والسياسة.
- كيف تتجنب تكراره؟
- اختبر null والغياب منفصلين.
تفشل قراءة بعد عودة منشئها.
- لماذا يحدث؟
- تخلصت الطريقة قبل الاكتمال.
- كيف تصلحه؟
- انتظر ضمن الملكية أونقل العمر.
- كيف تتجنب تكراره؟
- اختبر الاستهلاك المؤجل.
اختبر فهمك
1. يتاح بايتان لإطار مطلوب من أربعة. ما وعد المحلل؟
اعرض الحل المشروح
يبلغ الناقص ولا يفسر الجزئي ككامل ولا يعتمد الحالة إلا بعد القراءة والتحقق. ينظف المملوك ويحفظ تشخيص البتر ولا يقرأ غير المملوء. يحفظ التدريجي الجزئي بعقد مختلف صريح فقط.
2. لماذا لا يكفي حد نص بعد Deserialize لحجم المدخل؟
اعرض الحل المشروح
قد تسبب المدخل مسبقا مخازن ونصوصا وكائنات ومعالجة كبيرة. حد بايت النقل وعمق وشكل المحلل قبل الفك أوأثناءه ثم الأطوال المجالّية بعده. يختلف حد الوقت والإلغاء؛ لا يحد فحص واحد كل الموارد.
أهم ما تعلمته
- النقل الجزئي والصياغة الكاملة وصحة المجال ادعاءات مختلفة.
- يسبق الحد التخصيصات المراد ضبطها.
- تمتد الملكية إلى الاستهلاك غير المتزامن والمؤجل الفعلي.