public NestedType(NestedTypeWriter writeDelegate, NestedTypeReader readDelegate, NestedTypeWriter arrayWriter, NestedTypeReader arrayReader)
 {
     WriteDelegate = writeDelegate;
     ReadDelegate  = readDelegate;
     ArrayWriter   = arrayWriter;
     ArrayReader   = arrayReader;
 }
 public NestedType(NestedTypeWriter writeDelegate, NestedTypeReader readDelegate)
 {
     WriteDelegate = writeDelegate;
     ReadDelegate  = readDelegate;
 }
        private bool RegisterNestedTypeInternal <T>(Func <T> constructor) where T : INetSerializable
        {
            Type t = typeof(T);

            if (_registeredNestedTypes.ContainsKey(t))
            {
                return(false);
            }
            NestedType       nestedType;
            NestedTypeWriter nestedTypeWriter      = (writer, obj) => ((T)obj).Serialize(writer);
            NestedTypeWriter nestedTypeArrayWriter = (writer, arr) =>
            {
                T[] typedArr = (T[])arr;
                writer.Put((ushort)typedArr.Length);
                for (int i = 0; i < typedArr.Length; i++)
                {
                    typedArr[i].Serialize(writer);
                }
            };

            //struct
            if (constructor == null)
            {
                nestedType = new NestedType(
                    nestedTypeWriter,
                    reader =>
                {
                    T instance = default(T);
                    instance.Deserialize(reader);
                    return(instance);
                },
                    nestedTypeArrayWriter,
                    reader =>
                {
                    T[] typedArr = new T[reader.GetUShort()];
                    for (int i = 0; i < typedArr.Length; i++)
                    {
                        typedArr[i].Deserialize(reader);
                    }
                    return(typedArr);
                });
            }
            else //class
            {
                nestedType = new NestedType(
                    nestedTypeWriter,
                    reader =>
                {
                    T instance = constructor();
                    instance.Deserialize(reader);
                    return(instance);
                },
                    nestedTypeArrayWriter,
                    reader =>
                {
                    T[] typedArr = new T[reader.GetUShort()];
                    for (int i = 0; i < typedArr.Length; i++)
                    {
                        typedArr[i] = constructor();
                        typedArr[i].Deserialize(reader);
                    }
                    return(typedArr);
                });
            }
            _registeredNestedTypes.Add(t, nestedType);
            return(true);
        }