直列化さの配列を用いた整数XmlSerializer
-
23-08-2019 - |
質問
私は遭遇の問題をできるようにserialize複数の全次元の配列は整数によXmlSerializer、XNAプロジェクト仕事をしています。私がserializeすべてのその他のデータ(boolean値を代入文字列でも、色など)でも滞りなく進んでいるんです。私も多くの人が請求する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();
の例外を受けては、"独自のレンダリングメカニズムの例外の型システムInvalidOperationException'がSystem.Xml.dll.エラーがあったの生成、XMLドキュメント"
私はもってこの配列の一員としての変数構造体(すべての私のプレイヤーのデータが保存されるものでも同様の例外できるようにして、して、私はこの単純な構文エラーや何かをするようです。
いた構築が必要なの私のコードをserialize単一の全次元を配列、またはものがあるのか、それは何なのか私が一望?
感謝。
解決
の内部例外:
- エラーがあった反射タイプ'SomeType'.なserialize会員SomeType.データタイプシステムInt32[,,]'は、内部の例外です。
- なserialize型のオブジェクトのシステム。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 */ }
}
他のヒント
これは、マルクのgetに入ると、多次元配列をフラット化して展開する中括弧を設定すべきかを理解するために私にしばらく時間がかかっています。
ここでは、2Dアレイのための私のソリューションです。
私の場合、寸法の一つが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;
}
所属していません StackOverflow