97 lines
2.9 KiB
C#
97 lines
2.9 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Xml.Serialization;
|
|||
|
|
|||
|
namespace TransportGame.Utils
|
|||
|
{
|
|||
|
public static class SerializationHelper
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Converts float matrix to byte array
|
|||
|
/// </summary>
|
|||
|
/// <param name="matrix">Matrix to convert</param>
|
|||
|
/// <remarks>
|
|||
|
/// Bytes are stored as such:
|
|||
|
///
|
|||
|
/// Offset Size Content
|
|||
|
/// ------------------------
|
|||
|
/// 0 4 Width
|
|||
|
/// 4 8 Height
|
|||
|
/// 8 var 32bit floating point values
|
|||
|
///
|
|||
|
/// </remarks>
|
|||
|
/// <returns>Byte array</returns>
|
|||
|
public static byte[] ToByteArray(this float[,] matrix)
|
|||
|
{
|
|||
|
if (matrix == null)
|
|||
|
return null;
|
|||
|
|
|||
|
int w = matrix.GetLength(0);
|
|||
|
int h = matrix.GetLength(1);
|
|||
|
|
|||
|
List<byte> bytes = new List<byte>();
|
|||
|
|
|||
|
bytes.AddRange(BitConverter.GetBytes(w));
|
|||
|
bytes.AddRange(BitConverter.GetBytes(h));
|
|||
|
|
|||
|
for (int x = 0; x < w; x++)
|
|||
|
for (int y = 0; y < h; y++)
|
|||
|
bytes.AddRange(BitConverter.GetBytes(matrix[x, y]));
|
|||
|
|
|||
|
return bytes.ToArray();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Converts byte array to float matrix
|
|||
|
/// </summary>
|
|||
|
/// <param name="array">Byte array</param>
|
|||
|
/// /// <remarks>
|
|||
|
/// Bytes are expected to be stored as such:
|
|||
|
///
|
|||
|
/// Offset Size Content
|
|||
|
/// ------------------------
|
|||
|
/// 0 4 Width
|
|||
|
/// 4 8 Height
|
|||
|
/// 8 var 32bit floating point values
|
|||
|
///
|
|||
|
/// </remarks>
|
|||
|
/// <returns>Float matrix</returns>
|
|||
|
public static float[,] GetFloatMatrix(this byte[] array)
|
|||
|
{
|
|||
|
if (array == null)
|
|||
|
return null;
|
|||
|
|
|||
|
int pos = 0;
|
|||
|
int w = BitConverter.ToInt32(array, pos); pos += sizeof(int);
|
|||
|
int h = BitConverter.ToInt32(array, pos); pos += sizeof(int);
|
|||
|
|
|||
|
float[,] grid = new float[w, h];
|
|||
|
|
|||
|
for (int x = 0; x < w; x++)
|
|||
|
for (int y = 0; y < h; y++)
|
|||
|
{
|
|||
|
grid[x, y] = BitConverter.ToSingle(array, pos);
|
|||
|
pos += sizeof(float);
|
|||
|
}
|
|||
|
|
|||
|
return grid;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Deserializes a file
|
|||
|
/// </summary>
|
|||
|
/// <typeparam name="T">Type to deserialize</typeparam>
|
|||
|
/// <param name="filename">File name</param>
|
|||
|
/// <returns>Deserialized object</returns>
|
|||
|
public static T Deserialize<T>(string filename)
|
|||
|
{
|
|||
|
XmlSerializer serializer = new XmlSerializer(typeof(T));
|
|||
|
var stream = new StreamReader(filename);
|
|||
|
return (T)serializer.Deserialize(stream);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|