non, je n'ai pas utilisé ta classe, j'ai pris un WindowsForm existant, j'ai rajouté la list<> et j'ai lancé le code donné (GetFields) avec le typeConteneur == le Formulaire.
Tu peux essayer ceci :
ouvres la console visualStudio, positionnes toi sur le répertoire de ton assembly, et lance
ildasm.exe tonAssembly.exe (ou dll)
Tu pourras voir la reflexion et le code IL en double cliquant sur le champ voulu.
merci de répondre =D j'ai jamais de chances dans mes posts, ils doivent être trop spécifiques ^^
Oui en fait le code complet de la fonction est le suivant :
public static string serialise(object o) { string returnValue = "";
Type magicType = o.GetType(); returnValue += "<" + magicType.Name + ">"; foreach (var oField in magicType.GetFields()) { Type T = oField.FieldType; FieldInfo fi = magicType.GetField(oField.Name); object s = fi.GetValue(o); if (Convert.GetTypeCode(s) != TypeCode.Object) { returnValue += "<" + oField.Name + ">" + s.ToString() + "</" + oField.Name + ">"; } else { if (s is System.Collections.IList) { returnValue += "<" + oField.Name + ">" + serialise(s) + "</" + oField.Name + ">"; } else { returnValue += "<" + oField.Name + ">" + serialise(s) + "</" + oField.Name + ">"; } } } returnValue += "</" + magicType.Name + ">";
return returnValue; }
donc en gros l'idée est de refaire une sérialisation car je veux éviter d'utiliser les composant qui travaillent en xml. Si tu test ma fonction, tu remarquera que la liste est à pour nom "List'1" (à prioris c'est dû au fait que ca soit généric).
Ensuite je rate probablement quelque chose mais je ne vois pas quoi =/
ils doivent être trop spécifiques.....je veux éviter d'utiliser les composant qui travaillent en xml
Ha ba quand on veut réinventer l'Amérique aussi...
Et utiliser une classe comme ça:
public MaClasse
{
public string Nom {get; set;}
public string List<T> MesDonnees {get; set;}
}
Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
Ha ba quand on veut réinventer l'Amérique aussi...
c'est surtout que la dé-sérilisation se base sur de les classes xml qui comportent masse de fuites mémoire => la désérilisation d'un flux de 300Mo bouffe 550Mo en mémoire, et dans le cadre de mon travail ce n'est pas acceptable.
Mon problème correspond à la list en fait, non au type de list => je peux sans soucis récupérer les données contenu dans la liste et en connaitre le type, par contre le nom de élément n'est pas récupérer via Field, et c'est là tout mon problème =/
merci de ton aide
Ok mais au moment ou tu sérialises tu peux utiliser une classe comme je te l'ai proposé (enfin je ne connais pas l'ensemble de ton projet mais ça me semble jouable).
Sinon, il y a plusieurs outils de serialisation xml, les a tu tous testé? (XmlReader, Linq etc....)
Je ne comprend pas la première partie de ton message ... a mon avis il te manque une information : en fait non avons pas mal d'automates permettant de récupérer des données et nos objets varient d'un programme à un autre. L'idée est donc d'avoir une méthode "standard" que nous n'aurions pas à éditer sur chaque projet.
Oui j'ai testé plusieurs sérialisation mais le problème se trouve au niveau de l'objet de lecture xml, qui, au chargement, provoque de nombreuses fuites de mémoire. Or les méthodes de sérialisation exploitent toutes cet objet.
J'ai pu remarquer ces fuites lors de traitement de données : plus le fichier est lourd, plus la lecture devient de plus en plus longue (par exemple sur un flux de 500Mo, le parcours des 100 premiers mo prendra 20 minutes, tandis que la lecture des 100 dernier peu prendre jusque plus d'une journée).
J'ai donc du palier cela en traitant directement le texte, ce qui me permet de bien mieux gérer ma mémoire (les 500Mo sont traités en moins d'une heure par exemple) , mais la dé-sérialisation elle est bien trop lourd, malgrès l'appel du garbage collector, d'où mon développement.
En fait la sérialisation n'est pas nécessaire pour moi car elle ne pose pas de gros problème en soit, mais c'est la désérialisation. Or, la sérialisation étant bien plus simple de la désérialisation (qui va exploiter ce que la sérialisation utiliser, et +), j'ai préféré commencer par pouvoir sérialiser. Et mon problème aurai finalement été le même donc bon ^^
Avec ceci je récupère bien le nom de ma liste<> générique :
FieldInfo[] arrFi = leTypeConteneur.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo fi in arrFi)
{
// fi.Name contient le nom de la liste
}
en supposant que tu as pris ma classe, ce que tu me propose est exactement le problème que je rencontre, soit le fait que je ne récupère que
List'1
et non
ls
, qui est donc le nom que j'ai donné à ma variable ...
Merci d'essayer de m'aider en tout cas =D
Pour info, j'ai donc essayé de faire :
if (o is System.Collections.IList) { FieldInfo[] arrFi = myType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (FieldInfo fi in arrFi) { string s = fi.Name; // fi.Name contient le nom de la liste } }
28 août 2014 à 17:02
bne continuation.
naga