【问题标题】:Serialization and deserialization of an int matrix c#int矩阵c#的序列化和反序列化
【发布时间】:2013-12-13 15:48:18
【问题描述】:

我正在使用 c# WCF 服务,我需要在我的一种方法中将 int[,] 返回给客户端。问题是 WCF 不支持多维数组,所以我认为我唯一的选择是以这种方式返回字节数组:

    public byte[] DistanceMatrix()
    {
        int[,] matrix;

        //DOING THINGS HERE

        IFormatter formatter = new BinaryFormatter();
        var ms = new MemoryStream();
        formatter.Serialize(ms, matrix);

        return ms.ToArray();
    }

但我不知道如何将 byte[] 反序列化回 int[,]

【问题讨论】:

  • 您反序列化的方式几乎与您序列化的方式完全相同。将字节数组放回 MemoryStream 并通过 BinaryFormatter 的反序列化提供它。
  • 您是否尝试过以下 SO 答案? stackoverflow.com/questions/16400118/…

标签: c# arrays wcf serialization


【解决方案1】:

这位优秀的blog post by Josh Reuben可以帮到你:

允许您在序列化之前转换并在反序列化之后转换回来的扩展方法:

    public static T[,] ToMultiD<T>(this T[][] jArray)
    {
        int i = jArray.Count();
        int j = jArray.Select(x => x.Count()).Aggregate(0, (current, c) => (current > c) ? current : c);


        var mArray = new T[i, j];

        for (int ii = 0; ii < i; ii++)
        {
            for (int jj = 0; jj < j; jj++)
            {
                mArray[ii, jj] = jArray[ii][jj];
            }
        }

        return mArray;
    }

    public static T[][] ToJagged<T>(this T[,] mArray)
    {
        var cols = mArray.GetLength(0);
        var rows = mArray.GetLength(1);
        var jArray = new T[cols][];
        for (int i = 0; i < cols; i++)
        {
            jArray[i] = new T[rows];
            for (int j = 0; j < rows; j++)
            {
                jArray[i][j] = mArray[i, j];
            }
        }
        return jArray;
    }

【讨论】:

  • 不用担心,很高兴它有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2020-03-10
  • 2012-02-02
  • 2014-01-06
  • 2017-08-19
  • 2013-10-12
相关资源
最近更新 更多