예제 #1
0
        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);
            }
        }
예제 #2
0
        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());
        }
예제 #3
0
        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());
        }