Um das Thema mal abzuschließen:
Ich habe jetzt in einem
anderen Forum mal nach gefragt und dort hab ich den Tipp erhalten, das ganze doch mit Hilfe einer XML-Datei zu machen, nur wird die nicht geschrieben, sondern als MemoryStream gespeichert.
Mit diesem Lösungsweg kann man jeden Datentyp verwenden und eben auch Arrays, da das ganze über einen XML-Stream arbeitet. Mit Listen habe ich es aber nicht getestet, da ich keine Listen benutze.
Das ganze habe ich dann weiter verfolgt und nun habe ich zwei funktionierende Methoden:
PHP-Code:
public static string ArrayInStringCode<Type>(Type Array)
{
System.IO.MemoryStream newMemoryStream = new System.IO.MemoryStream();
System.Xml.Serialization.XmlSerializer xmlWriter = new System.Xml.Serialization.XmlSerializer(typeof(Type));
xmlWriter.Serialize(newMemoryStream, Array);
System.IO.StreamReader newStreamReader = new System.IO.StreamReader(newMemoryStream);
newStreamReader.BaseStream.Position = 0;
string result = newStreamReader.ReadToEnd();
newMemoryStream.Close();
newStreamReader.Close();
return result;
}
public static Type ArrayCodeInArray<Type>(string Code)
{
System.IO.MemoryStream newMemoryStream = new System.IO.MemoryStream(System.Text.ASCIIEncoding.Default.GetBytes(Code));
System.IO.StreamReader newStreamReader = new System.IO.StreamReader(newMemoryStream);
System.Xml.Serialization.XmlSerializer xmlReader = new System.Xml.Serialization.XmlSerializer(typeof(Type));
object result = xmlReader.Deserialize(newMemoryStream);
newMemoryStream.Close();
newStreamReader.Close();
return (Type)result;
}
Weitere using-Direktiven sind nicht nötig, da ich alle nötigen Direktiven schon in den Methoden eingefügt habe.
Hier mal ein Beispiel:
PHP-Code:
namespace ArrayAlsString
{
class Program
{
static void Main(string[] args)
{
// Das Feld wird erstellt
Person[] PersonenListe =
{
new Person("Hans", 13),
new Person("Peter", 15)
};
// Die Methode wird aufgerufen, um das Feld in einen Byte-Code zu schreiben
// In den spitzen Klammern muss der Typ übergeben werden. (Bei einem Feld muss auch das als Typ angegeben werden)
string ArrayCode = ArrayInStringCode<Person[]>(PersonenListe);
/*
* Nun kann der Byte-Code z.B. versendet werden
*/
// Die Methode wird aufgerufen, um aus dem Byte-Code wieder ein Feld zu erstellen
// In den spitzen Klammern muss der Rückgabetyp übergeben werden. (Bei einem Feld muss auch das als Typ angegeben
// werden)
Person[] PersonenListe2 = ArrayCodeInArray<Person[]>(ArrayCode);
// Die folgenden Zeilen sind zum testen gedacht
foreach (var item in PersonenListe2)
{
System.Console.Write("Name: " + item.Name + ", Alter: " + item.Alter);
System.Console.WriteLine();
}
// Pausiert das Program, damit das Ergebnis nicht sofort wieder ausgeblendet wird
System.Console.Read();
}
public static string ArrayInStringCode<Type>(Type Array)
{
// Eine neue Instanz der Klasse MemoryStream wird erstellt
System.IO.MemoryStream newMemoryStream = new System.IO.MemoryStream();
// Eine neue Instanz der Klasse XmlSerializer wird erstellt und dabei wird der angegebene Typ verwendet
System.Xml.Serialization.XmlSerializer xmlWriter = new System.Xml.Serialization.XmlSerializer(typeof(Type));
// Das Feld wird in den MemoryStream geschrieben
xmlWriter.Serialize(newMemoryStream, Array);
// Eine neue Instanz der Klasse StreamReader wird erstellt,
// damit der Stream gelesen und als String zurück gegeben werden kann
System.IO.StreamReader newStreamReader = new System.IO.StreamReader(newMemoryStream);
// Der StreamReader wird an den Anfang des Streams gesetzt, da er sonst am Ende steht
newStreamReader.BaseStream.Position = 0;
// Der Stream wird nun als String-Variable gespeichert
string result = newStreamReader.ReadToEnd();
// Alle Instanzen der Stream-Klassen werden geschlossen
newMemoryStream.Close();
newStreamReader.Close();
// Rückgabe
return result;
}
public static Type ArrayCodeInArray<Type>(string Code)
{
// Es wird eine neue Instanz der Klasse MemoryStream erstellt
// und gleichzeitig der Code in ein Byte-Array umgewandelt und der Instanz übergeben
System.IO.MemoryStream newMemoryStream = new System.IO.MemoryStream(System.Text.ASCIIEncoding.Default.GetBytes(Code));
// Es wird eine neue Instanz der Klasse StreamReader erstellt und der MemoryStream wird übergeben
System.IO.StreamReader newStreamReader = new System.IO.StreamReader(newMemoryStream);
// Eine neue Instanz der Klasse XmlSerializer wird erstellt und dabei wird der angegebene Typ verwendet
System.Xml.Serialization.XmlSerializer xmlReader = new System.Xml.Serialization.XmlSerializer(typeof(Type));
// Der Stream wird in der XmlSerializer-Instanz deserialisiert und als Objekt-Variable gespeichert
object result = xmlReader.Deserialize(newMemoryStream);
// Alle Instanzen der Stream-Klassen werden geschlossen
newMemoryStream.Close();
newStreamReader.Close();
// Rückgabe
return (Type)result;
}
}
// Erkläre ich nicht weiter, da das sowieso nur ein Beispiel ist. Die Methoden sollten mit allen Klassen und Datentypen funktionieren
public class Person
{
public string Name = null;
public int Alter=0;
public Person()
{ }
public Person(string newName, int newAlter)
{
Name = newName;
Alter = newAlter;
}
}
}
PS: Für schönere Methoden-Namen wäre ich sehr dankbar^^
Edit:
Man kann das ganze dann nun auch als Byte-Array zrück geben lassen, was vielleicht auch effektiver ist, da die Methoden dann beide kleiner sind, allerdings kann man das dann nicht mehr als einfacher Text verschlüsseln und ich weiß nicht, ob wie man Daten über das Internet versendet. Und Geschwindigkeitsunterschiede würde man wahrscheinlich erst bei gigantisch großen Feldern bemerken^^
Ich finde es als String einfach einfacher und außerdem war so das Thema.
Lesezeichen