اختبار للحقل الاختياري عند استخدام Serialization .NET مخصص

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

سؤال

إعطاء فئة مثل هذا واحد:

[Serializable]
public class MyClass {
    string name;
    string address;

    public MyClass(SerializationInfo info, StreamingContext context){
        name = info.GetString("name");
        if(/* todo: check if a value for address exists */)
            address = info.GetString("address");
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context){
        info.AddValue(name);
        if(address != null)
            info.AddValue(address);
    }
}

كيف يمكنني اختبار ما إذا كانت قيمة ل address الحقل موجود قبل الاتصال info.GetString(address)?

نعم، أنا أفهم أنني يمكن أن أكتب ببساطة فارغة address الحقل ولكن مشكلتي الحقيقية هي أن الإصدارات السابقة من MyClass, ، لم يكن لديك مجال عنوان.

ملحوظة: لدي أسباب وجيهة لاستخدام التسلسل المخصص. هناك بعض الحقول الثابتة التي يتم استخدامها كمفرد والتحلل الافتراضي لن يحترم ذلك.

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

المحلول

حسنا، نهج واحد مثير للاهتمام هو أنه يمكنك استخدام GetEnumerator (foreach) لتكرار أكثر من أزواج الاسم / القيمة، باستخدام switch على الاسم للتعامل مع كل بدوره؟

يبدو التنفيذ غير معيار قليلا، على الرغم من ذلك؛ من مثال هنا:

    SerializationInfoEnumerator e = info.GetEnumerator();
    Console.WriteLine("Values in the SerializationInfo:");
    while (e.MoveNext())
    {
        Console.WriteLine("Name={0}, ObjectType={1}, Value={2}",
             e.Name, e.ObjectType, e.Value);
    }

ولكن يبدو أنه يمكنك أيضا استخدام SerializationEntry:

[Serializable]
class MyData : ISerializable
{
    public string Name { get; set; }
    public int Value { get; set; }

    public MyData() { }
    public MyData(SerializationInfo info, StreamingContext context)
    {
        foreach (SerializationEntry entry in info)
        {
            switch (entry.Name)
            {
                case "Name":
                    Name = (string)entry.Value; break;
                case "Value":
                    Value = (int)entry.Value; break;
            }
        }
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Name", Name);
        info.AddValue("Value", Value);
    }
}

نصائح أخرى

أعلم أن هذا هو موضوع قديم جدا، لكن حلاي لهذه المشكلة هو إنشاء طريقة تمديد SerializationInfo. فئة مثل هذا:

namespace System.Runtime.Serialization
{
  public static class SerializationInfoExtensions
  {
    public static bool Exists(this SerializationInfo info, string name)
    {
      foreach (SerializationEntry entry in info)
        if (name == entry.Name)
          return true;
      return false;
    }
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top