gpt4 book ai didi

c# - DataContractSerializer 不支持矩形数组

转载 作者:太空狗 更新时间:2023-10-29 22:01:36 24 4
gpt4 key购买 nike

我今天遇到了一个意想不到的问题,试图序列化/反序列化一个包含 bool[,] DataMember 的 DataContract。 csc 和 runtime 都没有反对这个定义,但是反序列化的 bool[,] DataMember 中的值是不正确的。看完this thread ,我最初的 react 是将有问题的属性转换为锯齿状数组。然而,我不得不很快放弃这种方法,因为 this article通知锯齿状数组在对角线或随机访问时表现不佳(正是我的用例)。因此,我最终编写了上述 msdn 线程中提出的解决方案的策划版本(在导出/导入时将矩形转换为锯齿状,反之亦然,请参阅下面的代码摘录)并且效果很好。

public object GetDeserializedObject(object obj, Type targetType)
{
if (obj is GridArrayWrapper)
{
bool[,] arr;
GridArrayWrapper wrapper = (GridArrayWrapper)obj;
if (wrapper.Array == null) return null;
int d0 = wrapper.Array.Length;
if (d0 == 0)
{
return new bool[0, 0];
}
var d1 = wrapper.Array[0].Length;
arr = new bool[d0, d1];
for (int i = 0; i < d0; i++)
{
if (wrapper.Array[i].Length != d1) throw new ArgumentException("Not a rectangular array");
for (var j = 0; j < d1; j++)
{
arr[i, j] = wrapper.Array[i][j];
}
}
return arr;
}
return obj;
}

public object GetObjectToSerialize(object obj, Type targetType)
{
if (obj is bool[,])
{
bool[,] arr = (bool[,])obj;
GridArrayWrapper wrapper = new GridArrayWrapper();
int d0 = arr.GetLength(0);
int d1 = arr.GetLength(1);
wrapper.Array = new bool[d0][];
for (int i = 0; i < wrapper.Array.Length; i++)
{
wrapper.Array[i] = new bool[d1];
for (int j = 0; j < d1; j++)
{
wrapper.Array[i][j] = arr[i, j];
}
}
return wrapper;
}
return obj;
}

不过,我想知道对于这种或另一种方法是否有更简洁的解决方案。

最佳答案

我没有实现 GetDeserializedObject 和 GetObjectToSerialize,而是公开了一个不同的对象以进行序列化。顺便说一句,一维数组就足够了。我会这样做:

//No Datamember here
public bool[,] Data;

[DataMember(Name="Data")]
public bool[] XmlData
{
get {
bool[] tmp = new bool[Data.GetLength(0) * Data.GetLength(1)];
Buffer.BlockCopy(Data, 0, tmp, 0, tmp.Length * sizeof(bool));
return tmp;
}
set {
bool[,] tmp = new bool[,];
Buffer.BlockCopy(value, 0, tmp, 0, value.Length * sizeof(bool));
this.Data = tmp;
}
}

关于c# - DataContractSerializer 不支持矩形数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8002087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com