Lambda als Datei speichern und Laden?

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Lambda als Datei speichern und Laden?

    Hallo,
    Wist ihr ob es geht ein lambda als Datei zu speichern,
    Und dieses wieder aus der Datei zu laden (als lambda).

    Schon mal im Voraus danke für jede Antwort. ;)


    Euer Sirati!
    @Sirati: Willkommen im Forum. :thumbup:
    Bevor wir uns hier die Finger heiß tippen wäre es gut, wenn Du genau beschreiben würdest, was Du eigentlich möchtest.
    Nach diesen reichlichen Vorschlägen solltest Du nun Deine Vorstellungen präzisieren können.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich bezweifle ehrlich gesagt, dass das geht. Und ich kann mir den Sinn daraus nicht erschließen. Spätestens beim laden könnte es schwierig werden, denn Lambdas werden ja doch compiliert, können also schlecht zur Laufzeit erzeugt und Interpretiert werden.

    Einen Linq kannst du ja auch nicht serialisieren, und dieser ist nichts anderes als ein Lambda.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kagurame“ () aus folgendem Grund: implementieren / serialisieren => verwechslung o.o

    Lambdas können serialisiert werden, man benötigt nur den richtigen Formatter.

    LINQ geht leider nicht, außer man baut sich eine eigene Klasse dafür.

    Hier ein Beispiel für Lambda-Serialisation

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO 'Wird benötigt um den Stream zu schreiben
    3. Imports System.Runtime.Serialization.Formatters.Binary ' Wird benötigt um die Klasse zu serialisieren
    4. Module test
    5. Public Sub Main()
    6. Dim Pfad As String = "c:\lambda.bin" ' Hier wird die Datei gespeichert
    7. Dim ErsteVariable As New FunWithLambdas()
    8. 'Hier wird der Lambda erstellt
    9. ErsteVariable.Lambda1 = Sub(Text As String)
    10. MsgBox(Text)
    11. End Sub
    12. ' Hier testen wir den Lambda
    13. ErsteVariable.Lambda1.DynamicInvoke("LOL")
    14. ' Hier wird die Klasse gespeichert
    15. serialisieren(Pfad, ErsteVariable)
    16. ErsteVariable = Nothing
    17. ' Hier wird die Klasse in die neue Variable y geladen
    18. Dim ZweiteVariable As FunWithLambdas = deserialisieren(Pfad)
    19. ' Hier testen wir den Lambda
    20. ZweiteVariable.Lambda1.DynamicInvoke("Hallo")
    21. End Sub
    22. Sub serialisieren(ByVal Pfad As String, obj As Object) 'Speichert die Klasse in eine Datei
    23. Dim BF As New BinaryFormatter()
    24. Dim FS As New FileStream(Pfad, FileMode.Create)
    25. BF.Serialize(FS, obj)
    26. FS.Close()
    27. End Sub
    28. Function deserialisieren(ByVal Pfad As String) As FunWithLambdas 'Lädt die Klasse aus einer Datei
    29. Dim FS As New FileStream(Pfad, FileMode.Open)
    30. Dim BF As New BinaryFormatter()
    31. Dim obj As FunWithLambdas = CType(BF.Deserialize(FS), FunWithLambdas)
    32. FS.Close()
    33. Return obj
    34. End Function
    35. End Module
    36. <Serializable()> _
    37. Public Class FunWithLambdas 'In dieser Klasse wird der Lambda gespeichert
    38. Private _Lambda1 As [Delegate]
    39. Public Property Lambda1 As [Delegate]
    40. Get
    41. Return _Lambda1
    42. End Get
    43. Set(value As [Delegate])
    44. _Lambda1 = value
    45. End Set
    46. End Property
    47. End Class
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BiedermannS“ ()

    Wie gesagt, es war eine Vermutung. Wenn es wirklich geht... dann OK. Dann bin ich wieder etwas schlauer.

    Was sich mir noch nicht erschließt ist der Sinn des ganzen, aber egal... ^^


    PS: @BiedermannS
    Möchte dir nicht zu nahe treten, aber grade bei Neulingen o.ä. sollte man ein wenig auf´s Casing achten, und wenn schon nicht dann wenigstens darauf achten, dass man es Einheitlich macht ;)
    Referenz
    War nur so ein "quick and dirty"-Code, habs etwas verändert (Variablen umbenannt und so. :))

    Den Sinn den ich mir für sowas denken kann ist, das ein Befehl dynamisch generiert wird und dieser gespeichert wird.

    Oder mit einer "List of" eine Stapelverarbeitung (So ähnlich wie ein Script). Wobei das nicht umbedingt elegant ist, da man Lambdas nicht so einfach als XML serialisieren kann, womit man diese nicht von Hand nachbearbeiten kann.

    Aber vl erfahren wir ja den Sinn noch. :)
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    mit serialisiert klappt es nicht so wie es soll(hab es schon vorher versucht)

    hy

    ich habe eine dll geschrieben mit ihr habe ich ein lambda serialisiert.(erste app)

    dann mit einer anderen wieder deserialisiert (zweite app)

    leider gibt es heir immer einen Fehler:

    Spoiler anzeigen


    System.Reflection.TargetInvocationException wurde nicht behandelt.
    Message=Ein Aufrufziel hat einen Ausnahmefehler verursacht.
    Source=mscorlib
    StackTrace:
    bei System.RuntimeMethodHandle._SerializationInvoke(IRuntimeMethodInfo method, Object target, SignatureStruct& declaringTypeSig, SerializationInfo info, StreamingContext context)
    bei System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context)
    bei System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder)
    bei System.Runtime.Serialization.ObjectManager.DoFixups()
    bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
    bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
    bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
    bei add_on_s.BinarySerializer`1.DeserializeFromFile(FileInfo FileInfo) in C:\Users\########\Documents\Visual Studio 2010\Projects\add-on's\add-on's\BinarySerializer.vb:Zeile 23.
    bei test2.Module1.Main() in C:\Users\########\Documents\Visual Studio 2010\Projects\add-on's\test2\Module1.vb:Zeile 4.
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException: System.IO.FileNotFoundException
    FileName=test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    FusionLog==== Zustandsinformationen vor Bindung ===
    LOG: Benutzer = ######-VAIO\######
    LOG: DisplayName = test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    (Fully-specified)
    LOG: Appbase = file:///C:/Users/#######/Documents/Visual Studio 2010/Projects/add-on's/test2/bin/Debug/
    LOG: Ursprünglicher PrivatePath = NULL
    Aufruf von Assembly : (Unknown).
    ===
    LOG: Diese Bindung startet im default-Load-Kontext.
    LOG: Es wurde keine Anwendungskonfigurationsdatei gefunden.
    LOG: Die Hostkonfigurationsdatei wird verwendet:
    LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config wird verwendet.
    LOG: Die Richtlinie wird derzeit nicht auf den Verweis angewendet (private, benutzerdefinierte, teilweise oder pfadbasierte Assemblybindung)
    LOG: Download von neuem URL file:///C:/Users/#######/Documents/Visual Studio 2010/Projects/add-on's/test2/bin/Debug/test.DLL.
    LOG: Download von neuem URL file:///C:/Users/#######/Documents/Visual Studio 2010/Projects/add-on's/test2/bin/Debug/test/test.DLL.
    LOG: Download von neuem URL file:///C:/Users/#######/Documents/Visual Studio 2010/Projects/add-on's/test2/bin/Debug/test.EXE.
    LOG: Download von neuem URL file:///C:/Users/#######/Documents/Visual Studio 2010/Projects/add-on's/test2/bin/Debug/test/test.EXE.

    Message=Die Datei oder Assembly "test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.
    Source=mscorlib
    StackTrace:
    bei System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
    bei System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
    bei System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
    bei System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
    bei System.Reflection.Assembly.Load(String assemblyString)
    bei System.Runtime.Serialization.FormatterServices.LoadAssemblyFromString(String assemblyName)
    bei System.Reflection.MemberInfoSerializationHolder..ctor(SerializationInfo info, StreamingContext context)
    InnerException:




    es klappt auch nicht wenn man der app den lambda serialisiert

    dann im code den serialisiert code entfernen und denn deserialisiert code schreibt
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module2Sub main()
    2. Dim s1 As New add_on_s.Addon_Property(Of String)(Function(x As String) As StringReturn x
    3. End Function,
    4. Function(x As String) As StringReturn Strings.Left(x, 5)
    5. End Function, "")add_on_s.BinarySerializer(Of add_on_s.Addon_Property(Of String)).SerializeToFile(New IO.FileInfo("C:\hy\add"), s1)
    6. 'Dim s2 As add_on_s.Addon_Property(Of String) = add_on_s.BinarySerializer(Of add_on_s.Addon_Property(Of String)).DeserializeFromFile(New IO.FileInfo("C:\hy\add"))
    7. 'Do
    8. ' s2(Nothing) = Console.ReadLine
    9. ' Console.WriteLine(s2(Nothing))
    10. 'LoopEnd Sub
    11. End Module

    und dann wieder deserialisiert :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module2Sub main()
    2. 'Dim s1 As New add_on_s.Addon_Property(Of String)(Function(x As String) As String
    3. ' Return x
    4. ' End Function,
    5. ' Function(x As String) As String
    6. ' Return Strings.Left(x, 5)
    7. ' End Function, "")
    8. 'add_on_s.BinarySerializer(Of add_on_s.Addon_Property(Of String)).SerializeToFile(New IO.FileInfo("C:\hy\add"), s1)Dim s2 As add_on_s.Addon_Property(Of String) = add_on_s.BinarySerializer(Of add_on_s.Addon_Property(Of String)).DeserializeFromFile(New IO.FileInfo("C:\hy\add"))
    9. Dos2(Nothing) = Console.ReadLine
    10. Console.WriteLine(s2(Nothing))
    11. LoopEnd Sub
    12. End Module

    dann gibt es den fehler:
    Spoiler anzeigen
    System.Runtime.Serialization.SerializationException wurde nicht behandelt.
    Message=Der Member "_Lambda$__4" kann nicht ermittelt werden.
    Source=mscorlib
    StackTrace:
    bei System.Reflection.MemberInfoSerializationHolder.GetRealObject(StreamingContext context)
    bei System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder)
    bei System.Runtime.Serialization.ObjectManager.DoFixups()
    bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
    bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
    bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
    bei add_on_s.BinarySerializer`1.DeserializeFromFile(FileInfo FileInfo) in C:\Users\#######\Documents\Visual Studio 2010\Projects\add-on's\add-on's\BinarySerializer.vb:Zeile 23.
    bei test.Module2.main() in C:\Users\########\Documents\Visual Studio 2010\Projects\add-on's\test\Module1.vb:Zeile 37.
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException:

    außerdem andert sich die verhaltensweisen des deserialisiert codes wenn man imm debug den serialisierten code ändert
    ich wei? einfach nicht weiter ?(
    euer sirati :S
    Das Serialisieren und Deserialisieren setzt stets dieselbe Applikation voraus, das wird vom Framework getestet.
    Kannst Du bitte mal etwas genauer schreiben, was Du eigentlich vor hast?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Etwas mehr Info währe schon super.

    Das mit derselben Applikation stimmt nicht ganz, aber grundsätzlich muss in beiden Programmen die selbe Klasse vorhanden sein. Da diese ja als Datei gespeichert, bzw aus einer Datei geladen wird. Diese Klasse muss in beiden Programmen gleich sein.

    z.B.:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO 'Wird benötigt um den Stream zu schreiben
    3. <Serializable()> _
    4. Public Class MeinLambda 'In dieser Klasse wird der Lambda gespeichert
    5. Private _Lambda1 As [Delegate]
    6. Public Property Lambda1 As [Delegate]
    7. Get
    8. Return _Lambda1
    9. End Get
    10. Set(value As [Delegate])
    11. _Lambda1 = value
    12. End Set
    13. End Property
    14. End Class


    Wenn das gegeben ist kannst du mit der Anwendung1 serialisieren und mit Anwendung2 deserialisieren bzw. umgekehrt. Den Code zum Serialisieren habe ich doch bereits gepostet.

    Hier nochmal:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.Serialization.Formatters.Binary ' Wird benötigt um die Klasse zu serialisieren
    3. Sub serialisieren(ByVal Pfad As String, obj As MeinLambda) 'Speichert die Klasse in eine Datei
    4. Dim BF As New BinaryFormatter()
    5. Dim FS As New FileStream(Pfad, FileMode.Create)
    6. BF.Serialize(FS, obj)
    7. FS.Close()
    8. End Sub
    9. Function deserialisieren(ByVal Pfad As String) As MeinLambda 'Lädt die Klasse aus einer Datei
    10. Dim FS As New FileStream(Pfad, FileMode.Open)
    11. Dim BF As New BinaryFormatter()
    12. Dim obj As MeinLambda = CType(BF.Deserialize(FS), MeinLambda)
    13. FS.Close()
    14. Return obj
    15. End Function


    Der Rest sollte eigentlich kein Problem darstellen...
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Leute die classe und Serialisieren ist in einer dll

    hy

    also als antwort die zu Serialisierende Klasse ist genauso wie der Serialisierende code in einer selbstgeschriebenden dll

    ich möchte letztendlich eine addon funktion haben ,diese aber durch lambdas die als datei vorliegen erzeigen!!


    Dazu noch ich arbeite viel mit serialisieren und deserialisieren aber hier ist die sache einfach ein wenig paradox.

    also bitte keine antworten mehr wie man serialisieren . (das weiß ich)

    ich will nur wissen wie das mit Lambdas geht (sind propertys einer Klasse die serialisierbar ist)

    das problem ist das sich das ergebnis der deserialisierung abhangig von dem serialisierten code ist.

    das heißt wenn man die lambdas in der methode die die datei schreibt ändert ändert sich auch die funktion der deserialisierten datei

    selbst wenn man die serialisierungs Methode nicht aufruft und die serialisierte version der classe vor der änderung benutzt

    und das versteh ich nicht und weiß auch nicht wie ich das verhindern soll???? ?(


    euer sirati

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

    Kannst Du das mal ein bisschen tiefer erklären?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    die Idee ist mMn. unfug. Arbeite für ein Addon-System lieber mit Reflection und lade damit die Assemblies nach. Anschließend kannst du eine Verarbeitung auf Typ-Basis durchführen - Vorzugsweise per Vererbung oder Interface-Implementierung.
    Das Laden und Speichern von Methoden ist zwar möglich, indem du IL-Code speicherst und diesen anschließend lädst und in eine dynamische Assembly steckst oder unsauber ausführst o.Ä. aber nicht sinnvoll und wesentlich schwieriger, als die o.g. Lösung. Diese wäre vmtl. auch der allgemein gewählte Weg.

    Gruß
    ~blaze~
    Und bedenke, dass der Code getestet und gepflegt sein will.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    wie meinst du das genau

    hi

    ich weiß wes vererbung ist und benutzte es auch .

    meinst du also ich soll einen dll mit einer addon classe schrieben

    jemand der nun ein addon schrieben will importiert diese dll

    schreibt einen classe die von der addon klasse erbt

    dort zum beispiel die addon_main sub überschreibt



    so weiter weiß ich jetzt auch nicht

    dann wäre zum beispiel die frage wie man dll's dinamisch einbindet

    (sorrry habe keine zeit um im internet zu suchen muss eigendlich was anderes machen)

    oder wie würdest du es machen ein beispiel wäre schon(wenn es zeitlich passt)

    danke aber:) @~blaze~



    euer sirati,