using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO.MemoryMappedFiles;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Runtime.InteropServices;
using System.Xml.Serialization;
using Debug = System.Console;
public static partial class MemoryMappedFileExtensions
static readonly int LongSize = Marshal.SizeOf<long>();
public static long WriteAndFrame<T>(this MemoryMappedFile mmf, T value, long offset = 0, DataContractSerializer? serializer = null)
serializer ??= new DataContractSerializer(typeof(T));
using (var stream = mmf.CreateViewStream(checked(offset + LongSize), 0, MemoryMappedFileAccess.Write))
var startPosition = stream.Position;
serializer.WriteObject(stream, value);
actualSize = stream.Position - startPosition;
using (var accessor = mmf.CreateViewAccessor(offset, LongSize))
accessor.Write(0, actualSize);
return checked(actualSize + LongSize);
public static (T? Value, long SizeRead) ReadFromFrame<T>(this MemoryMappedFile mmf, long offset = 0, DataContractSerializer? serializer = null)
serializer ??= new DataContractSerializer(typeof(T));
using (var accessor = mmf.CreateViewAccessor(offset, LongSize))
accessor.Read(0, out actualSize);
using (var stream = mmf.CreateViewStream(offset + LongSize, actualSize, MemoryMappedFileAccess.Read))
return ((T?)serializer.ReadObject(stream), checked(actualSize + LongSize));
public static void Test()
using (var mmf = MemoryMappedFile.CreateFromFile("/dev/shm/test", System.IO.FileMode.OpenOrCreate, null, 10240, MemoryMappedFileAccess.ReadWrite))
WriteToMemoryMappedFile(mmf);
var infoObj = ReadFromMemoryMappedFile(mmf);
Console.WriteLine(infoObj?.Name);
Assert.That(infoObj?.Name == "TestApp");
private static void WriteToMemoryMappedFile(MemoryMappedFile mmf)
var infoObj = new SampleClass { Name = "TestApp" };
mmf.WriteAndFrame(infoObj);
private static SampleClass? ReadFromMemoryMappedFile(MemoryMappedFile mmf) =>
mmf.ReadFromFrame<SampleClass>().Value;
public string? Name { get; set; }
public static partial class DataContractSerializerHelper
public static string ToContractXml<T>(this T obj, DataContractSerializer? serializer = null, XmlWriterSettings? settings = null)
serializer = serializer ?? new DataContractSerializer(obj == null ? typeof(T) : obj.GetType());
using (var textWriter = new StringWriter())
settings = settings ?? new XmlWriterSettings { Indent = true };
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
serializer.WriteObject(xmlWriter, obj);
return textWriter.ToString();
public static T? FromContractXml<T>(string xml, DataContractSerializer? serializer = null)
using (var textReader = new StringReader(xml ?? ""))
using (var xmlReader = XmlReader.Create(textReader))
return (T?)(serializer ?? new DataContractSerializer(typeof(T))).ReadObject(xmlReader);
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("Failed with unhandled exception: ");