| 

.NET C# Java Javascript Exception

4
Hallo Leute,

beim Testen von MemoryMappedFiles-Funktionen bekomme ich folgenden Fehler:

Der Typ "string" darf keine NULL-Werte zulassen, wenn er als T-Parameter im generischen Typ oder in der generischen Methode "System.IO.UnmanagedMemoryAccessor.WriteArray<T>(long, T[], int, int)" verwendet werden soll.

Das ist der Codeausschnit, der den Fehler verursacht:
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(_MMFName, 1024))
{
using (MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor())
{
string[] namen = new string[] {"Hans", @"C:\Test\Versuch\Probe.TXT"};
mmva.WriteArray(0, namen, 0, namen.Length);
}
}


Wie muss ich ein string[] definieren, damit es als Parameter verwendet werden kann?

Vielen Dank für Eure Hilfe
Carsten
News:
19.04.2012
Carsten Ilwig 337 1 1 6
3 Antworten
3
Die Methode WriteArray ist folgendermaßen definiert:
public void WriteArray<T>(long position, T[] array, int offset, int count) 
where T : struct;

Da string kein struct ist, kannst Du diese Methode nicht für ein string[] verwenden. Da auch keine andere Write-Methode zur Verfügung steht, die einen string in ein MMF schreibt, musst Du Deinen String zuerst codieren.
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(_MMFName, 1024))
{
using (MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor())
{
string[] namen = new string[] { "Hans", @"C:\Test\Versuch\Probe.TXT" };

// alle Strings ASCII codieren und in ein einziges byte[] projizieren
var bytes = namen.SelectMany(s => Encoding.ASCII.GetBytes(s)).ToArray();

mmva.WriteArray(0, bytes, 0, bytes.Length);
}
}
19.04.2012
ffordermaier 8,4k 3 9
Ist vielleicht 'ne dumme Frage, aber wie wandle ich dann das Bytearray wieder in ein Stringarray um?
Wenn ich es so mache:

Decoder d = Encoding.UTF8.GetDecoder();
char[] chars = new char[bytes.Length];
int charLen = d.GetChars(bytes, 0, bytes.Length,chars, 0);

habe ich zware alle Buchstaben wieder, aber kann die einzelnen Einträge aus dem Array nicht mehr separieren.
Oder uss ich mir da ein eigenes System ausdenken?
Carsten Ilwig 19.04.2012
Ja, da musst Du Dir ein eigenes System ausdenken. Wenn Du das MMF nur mit .NET ausliest, kannst Du mit Serialisierung arbeiten, d.h. string[] in eine serialisierbare Klasse packen, mit dem BinaryFormatter serialisieren und das resultierende byte[] ins MMF schreiben. Wenn Du das dann wieder deserialisierst, dann kümmert sich der BinaryFormatter um Dein string[].
Ansonsten ist es nicht unüblich, dass man sich da ein eigenes Format ausdenkt. Du musst die Metainformation ja nicht unbedingt im MMF halten, sondern kannst auch eine (z.B. XML) Datei danebenlegen, die die Struktur enthält.
ffordermaier 19.04.2012
Ok, vielen Dank für die Tips.
Damit komme ich weiter.
Carsten Ilwig 19.04.2012
1
Schau Dir mal das "where" an: http://msdn.microsoft.com/de-de/library/bb384067.aspx

"where (Einschränkung des generischen Typs) (C#-Referenz)"

Ein where T : struct sorgt dafür, dass keine "Nullable" Typen übergeben werden können.

Ciao,
Mike

(leider gerade keine Zeit für weitere Ausführungen.)
19.04.2012
Xantiva 2,3k 2 9
0
Ok, vielen Dank an Euch Beide für die superschnelle Hilfe. :-)
Jetzt kann ich erst einmal weitertesten.

Carsten
19.04.2012
Carsten Ilwig 337 1 1 6

Stelle deine Memorymappedfiles-Frage jetzt!