Salut,
J'ai sérialisé un ArrayList par C#, et je veux le déserialiser dans un programme C++, est-ce que quelqu'un saura m'aider ? C++ pourra récupérer un ArrayList ?
Merci
Salut,
J'ai sérialisé un ArrayList par C#, et je veux le déserialiser dans un programme C++, est-ce que quelqu'un saura m'aider ? C++ pourra récupérer un ArrayList ?
Merci
la désérialisation en C++/CLI foncitonne de la meme facon qu'en c#, c'est juste une question de syntaxe
tu peux t'inspirer de la faq c++/cli http://dotnet.developpez.com/faq/cpp...#serialization
Là je veux une sérialisation binaire, parce que je pense qu'il n'y a pas d'objet de type ArrayList dans C++, à noter que mon outil que j'ai réalisé c'était en C#.
En fait, cet outil renvoie le projet sous format d'un tableau en C# (ArrayList) et les utilisateurs travaillent en C++ danc il veulent récupérer leur travail (càd l'ArrayList). Moi j'ai proposé le format XML pcq ça sera facil de le lire avec C++, mais l'encadrant m'a demandé le format binaire, l'idée que j'ai maintenant c'est de faire une sérialisation binaire manuelle, mais ça demande du travail.
Qu'est-ce que vous en pensez ?
le C++/CLI sait travailler avec les arraylist
maintenant, si tu veux faire une désérialisation native, il va surement falloir implémenter ton propre traducteur.
=> Comment déserialiser un ArrayList de C# avec C++ ?le C++/CLI sait travailler avec les arraylist
C'est-à-dire implémenter mon propre serializer, c'est ça ?maintenant, si tu veux faire une désérialisation native, il va surement falloir implémenter ton propre traducteur.
Désolé mais je comprend pas bien le terme natif.
ce qu'on entend par natif, c'est du C++ classique, qui ne sait pas utiliser le framework .net et donc par extension, qui n'a pas accès à la class ArrayList
le C++/CLI, c'est justement du C++ qui sait acceder au framework.Net. Si c'est de ce c++ dont tu parles, c'est TRES simple. Sinon, c'est plus dur![]()
Donc d'après ce que j'ai compris, puisque le C++ .NET comprendra l'ArrayList(C#) la solution est de créer un programme C++ .NET qui transformera mon ArrayList(C#) en ArrayList(C++ natif), c'est ça ?
ce que tu peux faire, c'est un intermédiaire oui.
Désérialiser ton objet en C++/CLI et construire une autre "liste" avec un des conteneurs de la stl, pour que ce soit utilisable en C++ pur
un programme exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 #include "stdafx.h" #include <windows.h> #include <vcclr.h> #include <iostream> #include <vector> using namespace System; using namespace System::Collections; int main(array<System::String ^> ^args) { // construction de l'arraylist avec des objets simples de type string ArrayList ^list = gcnew ArrayList(); list->Add("truc"); list->Add("bidule"); list->Add("chouette"); // sérialisation String ^resultSerialisation; System::Xml::Serialization::XmlSerializer ^ sr = gcnew System::Xml::Serialization::XmlSerializer(ArrayList::typeid); System::IO::TextWriter ^ writer = gcnew System::IO::StringWriter(); try { sr->Serialize(writer, list); resultSerialisation = writer->ToString(); } catch (Exception ^ e) { Console::WriteLine("Impossible de sérialiser : " + e->Message); return 0; } finally { writer->Close(); } // désérialisation ArrayList ^listClone; System::IO::TextReader ^reader = gcnew System::IO::StringReader(resultSerialisation); try { listClone = (ArrayList^)sr->Deserialize(reader); } catch (Exception ^ e) { Console::WriteLine("Impossible de désérialiser : " + e->Message); return 0; } finally { reader->Close(); } // parcours de la list pour construire un std::vector de std::string std::vector<std::string> vectorNatif; for each(String ^s in listClone) { // au passage, on transforme (marshalle) la chaine managée en chaine native char * chaineChar; pin_ptr<const wchar_t> wch = PtrToStringChars(s); int taille = (s->Length+1) * 2; chaineChar = new char[taille]; int t = WideCharToMultiByte(CP_ACP, 0, wch, taille, NULL, 0, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, wch, taille, chaineChar, t, NULL, NULL); std::string chaineSTL = chaineChar; vectorNatif.push_back(chaineSTL); delete chaineChar; } // parcours du vector for (unsigned int i = 0 ; i < vectorNatif.size() ; i++) std::cout << vectorNatif[i].c_str() << std::endl;; return 0; }
J'ai créé un projet C++ .NET accompagnant mon projet C#, j'ai essayer le code :
Mais quand je veux compiler il me retourne une erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <windows.h> #include <vcclr.h> #include <iostream> #include <vector> using namespace System; using namespace System::Collections; int main() { return 0; }
Je sais pas comment le faire, j'ai une autre question, comment appeler un programme C++ .NET par C#.Error 1 fatal error C1190: managed targeted code requires a '/clr' option c:\program files\microsoft visual studio 8\vc\include\vcclr.h 16
Merci,
Ok c bon, j'ai résolu ce problème, la solution je l'ai trouvée ici :http://dotnet.developpez.com/faq/cpp...onmode#clronly
Merci.
Partager