تسلسل مجموعة من الأعداد الصحيحة باستخدام xmlserializer

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

  •  23-08-2019
  •  | 
  •  

سؤال

أنا مواجه مشكلة أثناء محاولة تسلسل مجموعة متعددة الأبعاد من الأعداد الصحيحة عبر XMLSerializer لمشروع XNA أنا أعمل عليه. أنا قادر على تسلسل كل بياناتي الأخرى (المنطمنون، سلاسل، حتى الألوان، إلخ) دون عقبة. لقد رأيت أيضا الكثير من الأشخاص يزعمون أن Xmlserializer سوف تتعامل مع صفائف الأعداد الصحيحة (أحادية الأبعاد). هل هناك قيود يتعلق بالمصفائف متعددة الأبعاد، أم أنه شيء آخر يحدث هنا؟

إليك الرمز المناسب:

int[,,] scoredata = scores;  // Populated with data elsewhere 

filename = Path.Combine(container.Path, "scoredata.sav"); 
stream = File.Open(filename, FileMode.Create); 
serializer = new XmlSerializer(typeof(int[,,])); 
serializer.Serialize(stream, scoredata);  // This line throws the exception. 
stream.Close(); 

الاستثناء الذي أتلافه هو "استثناء غير معالج من النوع" System.invalidoperationException "قد حدث في system.xml.dll. حدث خطأ في إنشاء مستند XML."

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

هل أحتاج إلى إعادة هيكلة التعليمات البرمجية الخاصة بي لتسلسلها عبر مجموعة واحدة أبعاد، أم أن هناك شيء أطلني؟

شكرا مقدما!

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

المحلول

قراءة الاستثناءات الداخلية:

  • كان هناك خطأ يعكس نوع "في وقت عام". لا يمكن تسلسل العضو "Sapestype.data" من النوع "System.int32 [،]، انظر الاستثناء الداخلي لمزيد من التفاصيل.
  • لا يمكن تسلسل كائن من النوع System.int32 [،،]. المصفوفات متعددة الأبعاد غير مدعومة.

لذلك لا: صفائف متعددة الأبعاد ببساطة غير مدعومة. قد تضطر إلى شيم من خلال كصفيف واحد بعيد ... يمكنك القيام بذلك عن طريق وجود خاصية منفصلة تقوم بالترجمة:

[XmlIgnore]
public int[, ,] Data { get; set; }

[XmlElement("Data"), Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public int[] DataDto
{
    get { /* flatten from Data */ }
    set { /* expand into Data */ }
} 

نصائح أخرى

استغرق الأمر مني بعض الوقت لمعرفة ما يجب أن يذهب إلى Marc's Get Get and Set Fars faces لتسويت وتوسيع المصفوفات متعددة الأبعاد.

هنا هو حولي للحصول على صفائف ثنائية الأبعاد.

في حالتي، أعرف في وقت ترجمة الوقت أن أحد الأبعاد هو 4 لذلك لم يكن لدي لتخزين (بطريقة أو بأخرى) أبعاد الصفيف.

    [XmlIgnore]
    public int[,] Readings { get; set; }
    [XmlArray("Readings")]
    public int[] ReadingsDto { 
        get { return Flatten(Readings); }
        set { Readings = Expand(value, 4); }
    }

    public static T[] Flatten<T>(T[,] arr)
    {
        int rows0 = arr.GetLength(0);
        int rows1 = arr.GetLength(1);
        T[] arrFlattened = new T[rows0 * rows1];
        for (int j = 0; j < rows1; j++)
        {
            for (int i = 0; i < rows0; i++)
            {
                var test = arr[i, j];
                arrFlattened[i + j * rows0] = arr[i, j];
            }
        }
        return arrFlattened;
    }
    public static T[,] Expand<T>(T[] arr, int rows0)
    {
        int length = arr.GetLength(0);
        int rows1 = length / rows0;
        T[,] arrExpanded = new T[rows0, rows1];
        for (int j = 0; j < rows1; j++)
        {
            for (int i = 0; i < rows0; i++)
            {
                arrExpanded[i, j] = arr[i + j * rows0];
            }
        }
        return arrExpanded;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top