public static Data New(object data, Serializer binfmt, DataType datatype) { Data ret = new Data(); if (data == null) { ret.Ptr = IntPtr.Zero; ret.Size = 0; } else if (datatype == DataType.UInt) { staticalloc(4); uint value = (uint)data; byte[] d = staticdata; d[0] = (byte)((value) & 0xFF); d[1] = (byte)((value >> 8) & 0xFF); d[2] = (byte)((value >> 16) & 0xFF); d[3] = (byte)((value >> 24) & 0xFF); ret.Ptr = BytesToAlloc(d, 4, 1); ret.Size = (uint)4; } else if (datatype == DataType.IntArray) { int[] values = (int[])data; ret.Size = (uint)(4*values.Length); ret.Ptr = BytesToAlloc(values, values.Length, 4); /*} else if (datatype == DataType.String && false) { // Somehow this is slower than the below path. char[] values = ((string)data).ToCharArray(); ret.Size = (uint)(2*values.Length); ret.Ptr = BytesToAlloc(values, values.Length, 2);*/ } else { MemoryStream binary = binfmt.Serialize(data); if (binary.Length > uint.MaxValue) throw new ArgumentException("data is too large"); ret.Ptr = BytesToAlloc(binary.GetBuffer(), (int)binary.Length, 1); ret.Size = (uint)binary.Length; } return ret; }