Frage

Ich bin der Begegnung ein Problem bei dem Versuch, ein Multi-dimensionierte Array von ganzen Zahlen über XmlSerializer für ein XNA-Projekt zur Serialisierung auf ich arbeite. Ich bin in der Lage, alle meine anderen Daten zu serialisiert (booleans, Streicher, auch Farben, etc.) ohne Probleme. Ich habe auch viele Leute gesehen, behauptet, dass XmlSerializer nativ (Einzeldimensionierte) verarbeitet Arrays von ganzen Zahlen als gut. Gibt es eine Beschränkung in Bezug auf Multi-dimensionierten Arrays oder ist etwas anderes geht hier vor?

Hier ist der relevante Code:

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(); 

Die Ausnahme, die ich erhalte, ist „eine nicht behandelte Ausnahme des Typs‚System.InvalidOperationException‘aufgetreten in System.Xml.dll. Ein Fehler ist aufgetreten das XML-Dokument zu erzeugen.“

Ich habe auch versucht, dieses Array als Mitglied Variable in einer Struktur (wo alle meine anderen Spieler Daten gespeichert sind), aber ich bekomme die gleiche Ausnahme, wenn die Dinge auf diese Weise, wie auch tun, die mich führt zu glauben, dass es ist kein einfacher Syntaxfehler oder so etwas.

Muß ich meinen Code umstrukturieren über einen einzigen dimensionierte Array zu serialisiert, oder gibt es etwas, das ich mit Blick auf?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Lesen Sie

die Innen Ausnahmen:

  • Es gab einen Fehler Reflektierendes ‚Sometype‘. Kann nicht serialisiert Mitglied ‚SomeType.Data‘ vom Typ ‚System.Int32 [,,]‘, um weitere Informationen zu innerer Ausnahme sehen.
  • Kann nicht Objekt vom Typ serialisiert System.Int32 [,,]. Mehrdimensionale Arrays werden nicht unterstützt.

So nicht: multidimensionalen Arrays einfach werden nicht unterstützt. Sie können es Shim haben als eindimensionales Array durch ... Sie dies tun können eine separate Eigenschaft, indem die Übersetzung tut:

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

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

Andere Tipps

Es dauerte eine Weile, um herauszufinden, was in Marcs get gehen und setzt Klammer multidimensionalen Arrays zu glätten und erweitern.

Hier ist meine Lösung für 2D-Arrays.

In meinem Fall, ich weiß, bei der Kompilierung, dass eine der Dimensionen ist 4, so dass ich nicht speichern muß (irgendwie), um die Array-Dimensionen.

    [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;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top