c# <T> Problem

  • C#
  • .NET (FX) 4.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    c# <T> Problem

    Hallo ich habe folgendes Test snippet. Das Serialisieren Funktioniert nur das DeSerialisieren nicht mehr.

    Ich komme mit folgender Funktion nicht mehr klar -> public static T DeserializeFromXml<T>(string xml)
    kennt sich damit jemand aus?



    C#-Quellcode

    1. class Program
    2. {
    3. public static List<user> save_user = new List<user>() ;
    4. public static List<user> load_user = new List<user>();
    5. static void Main(string[] args)
    6. {
    7. user a1 = new user();
    8. user a2 = new user();
    9. a1.name="Adrian";
    10. a2.name = "Bob";
    11. save_user.Add(a1);
    12. save_user.Add(a2);
    13. SerializeToXml(save_user, "test.xml");
    14. //geht nicht <T> unverständlich
    15. load_user = DeserializeFromXml<user>("test.xml");
    16. }
    17. public static void SerializeToXml<T>(T obj, string fileName)
    18. {
    19. using (var fileStream = new FileStream(fileName, FileMode.Create))
    20. {
    21. var ser = new XmlSerializer(typeof(T));
    22. ser.Serialize(fileStream, obj);
    23. }
    24. }
    25. public static T DeserializeFromXml<T>(string xml)
    26. {
    27. T result;
    28. var ser = new XmlSerializer(typeof(T));
    29. using (var tr = new StringReader(xml))
    30. {
    31. result = (T)ser.Deserialize(tr);
    32. }
    33. return result;
    34. }
    35. }
    36. public class user
    37. {
    38. public string name;
    39. public int alter;
    40. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „bytefresser“ ()

    *Vollzitat entfernt*

    Weil dann gleich ein Fehler abgeworfen wird,der Fehler ist mir auch bewusst, ich weiß nur nicht wie die richtige Syntax in C# ist ->

    Fehler 1 Die Typargumente der ConsoleApplication1.Program.DeserializeFromXml<T>(string)-Methode können nicht per Rückschluss aus der Syntax abgeleitet werden. Geben Sie die Typargumente explizit an. C:\Users\technik4\Documents\Visual Studio 2013\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs 29 24 ConsoleApplication4

    Edit by ~blaze~:
    *Vollzitat entfernt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    "save_user" ist im Übrigen auch vom Typ List<user> (Der Klassenname sollte groß), aber Du deserialisierst ne normale, alleinige User-Klasse.

    @WhitePage Das muss er machen, weil er ja beim Deserialisieren nen Typen angeben muss und dafür nimmt man Generika her.
    Edit:// Jetzt warst Du schneller.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Was hat das mit der Syntax zu tun? Die ist ja richtig.
    Du sollst ne Liste deserialisieren oder einfach nen Eintrag hinzufügen, wie WhitePage sagte.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Ne, moment mal wir reden glaub aneinander vorbei.

    Ich will in "public static List<user> load_user = new List<user>();" die XML wieder reinquetschen. Kein einzelnes element. Sondern die ganze LIST<>


    PS. C# bereitet mit echt kopfzebrechen..
    Wovon reden wir die ganze Zeit?

    Trade schrieb:

    Du sollst ne Liste deserialisieren


    Übrigens, warum ist die Liste public und statisch?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Überlege doch mal:

    Der Typparameter ist erst ​user. <user>, dann soll er List<user> sein -> <List<user>>.
    Das war doch jetzt wirklich nicht schwer ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ja, das ist auch dann die Meldung.
    Siehe msdn.microsoft.com/de-de/library/hxfhx4sy(v=vs.90).aspx.
    Das kann dann nicht per Rückschluss den Typen ermitteln, den das T trägt und schwupps, da ist der Fehler, weil man den Typparameter nicht explizit angegeben hat.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Abgesehen davon übergibst du der Deserialize Funktion einen String in Form eines Dateinamens:

    C#-Quellcode

    1. load_user = DeserializeFromXml<List<user>>("test.xml");


    Wenn du es schon so übergibst musst du in der Funktion selbst dann aber den Inhalt der Datei noch lesen:

    C#-Quellcode

    1. public static T DeserializeFromXml<T>(string xml) {
    2. var ser = new XmlSerializer(typeof(T));
    3. var tr = new StringReader(File.ReadAllText(xml));
    4. return (T)ser.Deserialize(tr);
    5. }


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten