ما هي كل إدخالات التجميع الفارغة في DataContract الخاص بي XML؟

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

سؤال

هل يعرف أي شخص لماذا قد يضيف NetDatacontractSerializer إدخالات "لا شيء" في مجموعة متسلسلة؟

علي سبيل المثال،

  <Jobs z:Id="17">
    <_items z:Id="18" z:Size="4">
      <JobRecord z:Id="19">
        <Name z:Id="20">Job1</Name>
      </JobRecord>
      <JobRecord i:nil="true" />
      <JobRecord i:nil="true" />
      <JobRecord i:nil="true" />
    </_items>
    <_size>1</_size>
    <_version>2</_version>
  </Jobs>

لاحظ الإدخالات الثلاثة "Jobrecord" الإضافية والعنصر الإضافي الذي يقول "مهلا ، أعرف أن هناك أربع عقد هنا ، ولكن واحدة منها فقط تعني أي شيء".

يبدو وكأنه سلوك غريب. حسنًا ، حتى أتمكن من رؤية أن أقران NDCS بعمق في الرسم البياني للكائن وقد يكونون يتنقلون مع صفيف دعم يحتوي على حجم أكبر من عدد العناصر التي يتم تسلسلها (فكر في صفيف الدعم للحصول على قائمة).

هل هذا ما يحدث هنا؟ هل هي قطعة أثرية للفئة التي ينشئها المنشئ للتعامل معها yield return (ما هو مصدر JobRecord)؟

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

المحلول

في .NET Collections and Lists Work عن طريق تغيير حجم السيارات عندما تنفد من الفضاء. لجعل هذا الكفاءة لا يتم تغيير حجمه بمقدار واحد إضافي في كل مرة ينفدون فيه ، فإنهم يستخدمون خوارزمية داخلية لتغيير حجم وترك بعض المساحة الإضافية ، والهدف من أنه لا يتعين عليهم تغيير حجمه كثيرًا.

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

إذا كانت قائمة تستخدمها ، فيمكنك التحقق من المساحة الداخلية من خلال النظر إلى Capacity منشأه.

إذا كنت ترغب في إزالة أي مساحة إضافية قبل أن تقوم بتسلسل المجموعة التي يمكنك الاتصال بها.

myStuff.Capacity = myStuff.Count;

سيؤدي ذلك إلى تحديد السعة المتاحة لتكون نفس عدد العناصر الموجودة ، لذلك لن يكون هناك مساحة محجوزة.

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

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

نصائح أخرى

مجرد تخمين ، ولكن لاحظ z:Size="4". يشبه أربعة JobRecord إدخالات لي ، وأعتقد أن ثلاثة منهم = null.

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