public static void Send(this IEnumerable <Connection> target, int channelKey, MessageWriter message) { var payload = new MemoryWriter(); message(payload); var buffer = payload.GetBuffer(); var length = payload.Length; foreach (var conn in target) { conn.Send(channelKey, buffer, length); } }
internal static MemberSerializer[] CreateMemberSerializers(Expression obj, ParameterExpression writer) { return(obj.Type.GetRuntimeProperties() .Where(x => x.CanRead && !x.GetMethod.IsStatic && (x.GetMethod.IsPublic || x.IsDefined(typeof(DataMemberAttribute))) && x.GetIndexParameters().Length == 0) .Select(x => Tuple.Create(x as MemberInfo, Expression.Property(obj, x))) .Concat( obj.Type.GetRuntimeFields().Where(x => !x.IsStatic && (x.IsPublic || x.IsDefined(typeof(DataMemberAttribute)))) .Select(x => Tuple.Create(x as MemberInfo, Expression.Field(obj, x))) ) .Where(x => !x.Item1.IsDefined(typeof(IgnoreDataMemberAttribute))) .Select(x => { //TODO?: Supporting EmitDefaultValue is difficult... var dataMemberAttr = x.Item1.GetCustomAttribute <DataMemberAttribute>(); var customSerializer = x.Item1.GetCustomAttribute <CustomSerializerAttribute>()?.CustomSerializerType; return dataMemberAttr == null ? Tuple.Create(-1, x.Item1.Name, x.Item2, customSerializer) : Tuple.Create(dataMemberAttr.Order, dataMemberAttr.Name ?? x.Item1.Name, x.Item2, customSerializer); }) .OrderBy(x => x.Item1) .ThenBy(x => x.Item2) .Select((x, i) => { // nameBytes // { '{' or ',', ... escaped string ..., ':' } byte[] nameBytes; using (var memWriter = new MemoryWriter()) { WriteStringLiteral(memWriter, x.Item2); var buffer = memWriter.GetBuffer(); nameBytes = new byte[buffer.Count + 2]; nameBytes[0] = i == 0 ? (byte)'{' : (byte)','; nameBytes[nameBytes.Length - 1] = (byte)':'; Buffer.BlockCopy(buffer.Array, buffer.Offset, nameBytes, 1, buffer.Count); } return new MemberSerializer { WriteNameExpr = Expression.Call(writer, WriteBytesMethod, Expression.Constant(nameBytes)), GetValueExpr = x.Item3, CustomSerializer = x.Item4 }; }) .ToArray()); }
public void GeneralSerialization() { var writer = new MemoryWriter(); writer.Write(true); writer.Write(123); writer.Write(-0.25f); writer.Write('c'); var guid = Guid.NewGuid(); writer.Write(guid); writer.Write("Hello"); writer.Write(new Vector2(0.25f, -0.3f)); writer.Write(new Vector3(0.5f, -0.6f, 0.25f)); writer.Write(new Vector4(0.75f, -0.9f, -0.4f, 0.333f)); writer.Write(new Quaternion(0.75f, -0.9f, -0.4f, 0.333f)); var reader = new MemoryReader(writer.GetBuffer(), writer.Length); Assert.True(reader.ReadBoolean()); Assert.AreEqual(123, reader.ReadInt32()); Assert.AreEqual(-0.25f, reader.ReadSingle()); Assert.AreEqual('c', reader.ReadChar()); Assert.AreEqual(guid, reader.ReadGuid()); Assert.AreEqual("Hello", reader.ReadString()); Assert.AreEqual(new Vector2(0.25f, -0.3f), reader.ReadVector2()); Assert.AreEqual(new Vector3(0.5f, -0.6f, 0.25f), reader.ReadVector3()); Assert.AreEqual(new Vector4(0.75f, -0.9f, -0.4f, 0.333f), reader.ReadVector4()); Assert.AreEqual(new Quaternion(0.75f, -0.9f, -0.4f, 0.333f), reader.ReadQuaternion()); }