6
mars
2008
[C# et C++/CLI] Sérialisation et désérialisation binaire
mars
2008
Un article de nico-pyright(c)
Pas de commentaires
Pour sérialiser et désérialiser en binaire, on va utiliser l’objet BinaryFormatter qui fait partie du namespace System.Runtime.Serialization.Formatters.Binary.
Combiné à un MemoryStream pour que ca se fasse en mémoire, voilà en résultat deux méthodes génériques (une version C++/CLI et une version C#):
Exemple en C++/CLI
using namespace System;
using namespace System::IO;
using namespace System::Runtime::Serialization::Formatters::Binary;
generic<typename T>
String^ Serialize(T obj)
{
BinaryFormatter^ bf = gcnew BinaryFormatter();
MemoryStream^ ms = gcnew MemoryStream();
bf->Serialize(ms, obj);
array<unsigned char>^ buff = ms->ToArray();
ms->Close();
return Convert::ToBase64String(buff);
}
generic<typename T>
T DeSerialize(String ^val)
{
array<unsigned char>^ buff = Convert::FromBase64String(val);
BinaryFormatter ^bf = gcnew BinaryFormatter();
MemoryStream ^ms = gcnew MemoryStream(buff);
T result = (T) bf->Deserialize(ms);
ms->Close();
return result;
}
int main(array<System::String ^> ^args)
{
array<String ^> ^ tabASerialiser = gcnew array<String ^> {"abc", "def", "ghi"};
array<int> ^ tab2ASerialiser = gcnew array<int> { 123, 456, 789 };
// serialisation
String ^val = Serialize(tabASerialiser);
String ^val2 = Serialize(tab2ASerialiser);
// deserialisation
array<String ^> ^ result = DeSerialize<array<String ^> ^>(val);
array<int> ^ result2 = DeSerialize<array<int> ^>(val2);
for (int i = 0 ; i < result->Length ; i++)
Console::WriteLine(result[i]);
Console::WriteLine();
for (int i = 0; i < result->Length; i++)
Console::WriteLine(result2[i]);
return 0;
}
using namespace System::IO;
using namespace System::Runtime::Serialization::Formatters::Binary;
generic<typename T>
String^ Serialize(T obj)
{
BinaryFormatter^ bf = gcnew BinaryFormatter();
MemoryStream^ ms = gcnew MemoryStream();
bf->Serialize(ms, obj);
array<unsigned char>^ buff = ms->ToArray();
ms->Close();
return Convert::ToBase64String(buff);
}
generic<typename T>
T DeSerialize(String ^val)
{
array<unsigned char>^ buff = Convert::FromBase64String(val);
BinaryFormatter ^bf = gcnew BinaryFormatter();
MemoryStream ^ms = gcnew MemoryStream(buff);
T result = (T) bf->Deserialize(ms);
ms->Close();
return result;
}
int main(array<System::String ^> ^args)
{
array<String ^> ^ tabASerialiser = gcnew array<String ^> {"abc", "def", "ghi"};
array<int> ^ tab2ASerialiser = gcnew array<int> { 123, 456, 789 };
// serialisation
String ^val = Serialize(tabASerialiser);
String ^val2 = Serialize(tab2ASerialiser);
// deserialisation
array<String ^> ^ result = DeSerialize<array<String ^> ^>(val);
array<int> ^ result2 = DeSerialize<array<int> ^>(val2);
for (int i = 0 ; i < result->Length ; i++)
Console::WriteLine(result[i]);
Console::WriteLine();
for (int i = 0; i < result->Length; i++)
Console::WriteLine(result2[i]);
return 0;
}
Exemple en C#
public static string Serialize<T>(T obj)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, obj);
byte[] buff = ms.ToArray();
ms.Close();
return Convert.ToBase64String(buff);
}
public static T DeSerialize<T>(string val)
{
byte[] buff = Convert.FromBase64String(val);
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream(buff);
T result = (T) bf.Deserialize(ms);
ms.Close();
return result;
}
static void Main()
{
string[] tabASerialiser = new string[] {"abc", "def", "ghi"};
int[] tab2ASerialiser = new int[] { 123, 456, 789 };
// serialisation
string val = Serialize(tabASerialiser);
string val2 = Serialize(tab2ASerialiser);
// deserialisation
string[] result = DeSerialize<string[]>(val);
int[] result2 = DeSerialize<int[]>(val2);
for (int i = 0 ; i < result.Length ; i++)
Console.WriteLine(result[i]);
Console.WriteLine();
for (int i = 0; i < result.Length; i++)
Console.WriteLine(result2[i]);
}
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, obj);
byte[] buff = ms.ToArray();
ms.Close();
return Convert.ToBase64String(buff);
}
public static T DeSerialize<T>(string val)
{
byte[] buff = Convert.FromBase64String(val);
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream(buff);
T result = (T) bf.Deserialize(ms);
ms.Close();
return result;
}
static void Main()
{
string[] tabASerialiser = new string[] {"abc", "def", "ghi"};
int[] tab2ASerialiser = new int[] { 123, 456, 789 };
// serialisation
string val = Serialize(tabASerialiser);
string val2 = Serialize(tab2ASerialiser);
// deserialisation
string[] result = DeSerialize<string[]>(val);
int[] result2 = DeSerialize<int[]>(val2);
for (int i = 0 ; i < result.Length ; i++)
Console.WriteLine(result[i]);
Console.WriteLine();
for (int i = 0; i < result.Length; i++)
Console.WriteLine(result2[i]);
}
NB : J’utilise une conversion en base 64 car dans mon cas, j’ai eu besoin de stocker l’information sérialisée sous forme de chaine.
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007