Einfaches Speicherformat mit aufruf über strings

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von 00yoshi.

    Einfaches Speicherformat mit aufruf über strings

    Ich würde gerne die Daten von bestimmten "Blöcken" in solch einem Format speichern, der Einfachheit halber.
    Zwar geht:

    VB.NET-Quellcode

    1. Dim X() as DataTag
    2. X("tag1") = new DataTag(BlaBla)

    Aber es löst einen Fehler aus.
    Ich könnte auch eine Zuordnung hinzufügen mit ner Array wie folgt:

    VB.NET-Quellcode

    1. Dim Name as string = "blabla"
    2. Dim Zuordnung() as String = {"tag1","value","blabla"}
    3. For I as Integer = 0 to Zuordnung.count - 1
    4. If Zuordnung(I) = Name then Return X(I)
    5. Next

    Geht zwar bei kleinerem aber nicht mehrere tausend mal pro sekunde (Oder vllt nur einige hundert mal?) (Die Tags können auch größer sein, z.B. 25 Objekte beinhalten.)
    Hat verdammt weitergeholfen. Mal sehen, ob's auch klappt. (Also das Programmieren schon...)
    So sieht's aus:

    VB.NET-Quellcode

    1. Public Class TagComposite
    2. Dim Tags As New Dictionary(Of String, DataTag)
    3. Sub AddTag(Name As String, Value As DataTag)
    4. Tags.Add(Name, Value)
    5. End Sub
    6. Sub RemoveTag(Name As String)
    7. Tags.Remove(Name)
    8. End Sub
    9. Function ReadTag(Name As String)
    10. Return Tags(Name)
    11. End Function
    12. Sub WriteTag(name As String, Value As DataTag)
    13. Tags(name) = Value
    14. End Sub
    15. End Class

    Fällt euch irgendwas fehlendes auf? Wenn nicht, ist ja alles gut :)

    00yoshi schrieb:

    irgendwas fehlendes
    Ein Dictionary lässt ja immer nur einen unären Namen zu. In diesem Sinne könntest Du die Prozeduren AddTag() und WriteTag() zusammenfassen.
    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!
    Nur mal so n problem:
    Ich habe jetzt verschiedene Klassen die DataTag vererben, sodass man sie in die Dictionary stecken kann aber im code kann man nicht einfach schreiben:

    VB.NET-Quellcode

    1. Dim N As New DataTag
    2. N = New ByteTag(44)
    3. N.[u]TEST()[/u]

    ByteTag-Klasse
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class ByteTag
    2. Inherits DataTag
    3. Public Value As Byte = 0
    4. Sub New(Value As Byte)
    5. Me.Value = Value
    6. End Sub
    7. Public Overrides Function ToString() As String
    8. Return "b" & Chr(Value)
    9. End Function
    10. Public Sub TEST()
    11. End Sub
    12. End Class

    Entweder du musst die Methode in der DataTag klasse verfügbar machen (abstrakt)
    Oder den DataTag zum ByteTag casten wenn es diese Methode nur in ByteTag geben soll (dabei ist nur signatur entscheidend nicht die Implementierung)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    00yoshi schrieb:

    So etwas mach ich dann glaub ich auch
    Dann musst Du der Klasse DataTag und / oder der Klasse ByteTag die Methode readByte() implementieren.
    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!
    Meine Idee:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Data
    3. Dim Data() As Byte
    4. Sub New(Data() As Byte)
    5. Me.Data = Data
    6. End Sub
    7. Public Shared Widening Operator CType(ByVal Value As Data) As Byte
    8. Return Value.Data(0)
    9. End Operator
    10. Public Shared Widening Operator CType(ByVal Value As Data) As Short
    11. Return BitConverter.ToInt16(Value.Data, 0)
    12. End Operator
    13. Public Shared Widening Operator CType(ByVal Value As Data) As Integer
    14. Return BitConverter.ToInt32(Value.Data, 0)
    15. End Operator
    16. Public Shared Widening Operator CType(ByVal Value As Data) As Long
    17. Return BitConverter.ToInt64(Value.Data, 0)
    18. End Operator
    19. Public Shared Widening Operator CType(ByVal Value As Data) As Single
    20. Return BitConverter.ToSingle(Value.Data, 0)
    21. End Operator
    22. Public Shared Widening Operator CType(ByVal Value As Data) As Double
    23. Return BitConverter.ToDouble(Value.Data, 0)
    24. End Operator
    25. Public Shared Widening Operator CType(ByVal Value As Data) As Boolean
    26. Return BitConverter.ToBoolean(Value.Data, 0)
    27. End Operator
    28. Public Shared Widening Operator CType(ByVal Value As Data) As Char
    29. Return BitConverter.ToChar(Value.Data, 0)
    30. End Operator
    31. Public Shared Widening Operator CType(ByVal Value As Data) As UShort
    32. Return BitConverter.ToUInt16(Value.Data, 0)
    33. End Operator
    34. Public Shared Widening Operator CType(ByVal Value As Data) As UInteger
    35. Return BitConverter.ToUInt32(Value.Data, 0)
    36. End Operator
    37. Public Shared Widening Operator CType(ByVal Value As Data) As ULong
    38. Return BitConverter.ToUInt64(Value.Data, 0)
    39. End Operator
    40. Public Shared Widening Operator CType(ByVal Value As Byte) As Data
    41. Return New Data({Value})
    42. End Operator
    43. Public Shared Widening Operator CType(ByVal Value As Short) As Data
    44. Return New Data(BitConverter.GetBytes(Value))
    45. End Operator
    46. Public Shared Widening Operator CType(ByVal Value As Integer) As Data
    47. Return New Data(BitConverter.GetBytes(Value))
    48. End Operator
    49. Public Shared Widening Operator CType(ByVal Value As Long) As Data
    50. Return New Data(BitConverter.GetBytes(Value))
    51. End Operator
    52. Public Shared Widening Operator CType(ByVal Value As Single) As Data
    53. Return New Data(BitConverter.GetBytes(Value))
    54. End Operator
    55. Public Shared Widening Operator CType(ByVal Value As Double) As Data
    56. Return New Data(BitConverter.GetBytes(Value))
    57. End Operator
    58. Public Shared Widening Operator CType(ByVal Value As Boolean) As Data
    59. Return New Data(BitConverter.GetBytes(Value))
    60. End Operator
    61. Public Shared Widening Operator CType(ByVal Value As Char) As Data
    62. Return New Data(BitConverter.GetBytes(Value))
    63. End Operator
    64. Public Shared Widening Operator CType(ByVal Value As UShort) As Data
    65. Return New Data(BitConverter.GetBytes(Value))
    66. End Operator
    67. Public Shared Widening Operator CType(ByVal Value As UInteger) As Data
    68. Return New Data(BitConverter.GetBytes(Value))
    69. End Operator
    70. Public Shared Widening Operator CType(ByVal Value As ULong) As Data
    71. Return New Data(BitConverter.GetBytes(Value))
    72. End Operator
    73. End Class

    00yoshi schrieb:

    Meine Idee
    Ein Wrapper wofür?
    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!