2013-12-13 6 views
3

Я использую службу WCF C#, и мне нужно вернуть int[,] клиенту в одном из моих методов. Проблема состоит в том многомерные массивы не поддерживаются WCF, так что я думаю, что мой единственный вариант возвращает массив байтов таким образом:Сериализация и десериализация матрицы int C#

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[,].

+0

Вы десериализации почти точно так же, как сериализовать. Поместите массив байтов обратно в MemoryStream и подайте его через Deserialize BinaryFormatter. –

+0

Вы попробовали следующий ответ? http://stackoverflow.com/questions/16400118/wcf-multi-dimensional-arrays-are-not-supported – Ghost93

ответ

2

Это отличный 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; 
    } 
+1

Спасибо, что отлично работает – Federico

+1

Не беспокойтесь, рад, что это помогло. – chridam

Смежные вопросы