首先,使用foreach
循環將原始數組序列化。它會使陣列變平。
然後,在被序列化以同樣的方式讀出值(代碼是基於陣列的enumerator)
var original = new int[2,2,2] { { { 1, 2 }, { 3, 4} }, { { 5, 6 }, { 7, 8 } } };
var serialized = original.Cast<int>().ToArray();
var originalBounds = Enumerable.Range(0, original.Rank)
.Select(i => original.GetUpperBound(i) + 1).ToArray();
var empty = Array.CreateInstance(typeof(int), originalBounds);
var indices = new int[empty.Rank];
indices[indices.Length - 1]--;
var index = 0;
while (IncArray(empty, indices))
{
empty.SetValue(serialized[index++], indices);
}
private bool IncArray(Array array, int[] indices)
{
int rank = array.Rank;
indices[rank - 1]++;
for (int i = rank - 1; i >= 0; i--)
{
if (indices[i] > array.GetUpperBound(i))
{
if (i == 0)
{
return false;
}
for (int j = i; j < rank; j++)
{
indices[j] = 0;
}
indices[i - 1]++;
}
}
return true;
}
這種方法將允許你從流中讀取的值 - 你不需要像我一樣創建serialized
陣列。另一種方式是使用Buffer.BulkCopy
。在這裏,您必須讀取整個數組,至少以字節爲單位,並計算需要複製的字節數。這樣做的好處是你可以避免以前方法中的所有拳擊,並且它更簡單:
var bytes = new byte[...]; // read the entire byte array
var empty = Array.CreateInstance(typeof(int), originalBounds);
Buffer.BlockCopy(bytes, 0, empty, 0, bytes.Length);
你關心命令,或者你只需要數組中的所有值? – user3185569
是的,我需要讀取BinaryReader中的所有內容以獲取最初序列化完全相同的數組。 – SilentSin
使用BinaryFormatter不是一個選項嗎? –