예제 #1
0
 //public static List<KNetSerializedField> DEBUG_SEND_BUFFERED_VALUES() {
 //    return SendBufferedValues();
 //}
 internal void SendBufferedValues(KNetConnection newClient)
 {
     //List<KNetSerializedField> serializedFields = new List<KNetSerializedField>();
     foreach (var view in KlivenNet.Views)
     {
         int buffFieldId = -1;
         foreach (var bufferedField in view.BufferedFields)
         {
             buffFieldId++;
             var fieldType  = bufferedField.FieldType;
             var bufferable = KNetUtils.IsSerializable(fieldType);
             if (bufferable == SerializableType.nonSerializable)
             {
                 KNetLogger.LogError($"KNetServer: could not serialize field {bufferedField.Name} on KNetView {view.Id}: does {bufferedField.DeclaringType.Name} implement KNetSerializable interface?");
                 continue;
             }
             // Console.WriteLine(bufferedField.Name + " is bufferable: " + bufferable);
             var bytes = KNetUtils.Serialize(bufferedField.GetValue(view), bufferable, out int count);
             if (bytes == null)
             {
                 continue;
             }
             var serializedField = new KNetSerializedField(view.Id, buffFieldId, bytes);
             serializedField.count = count;
             var packet = KNetUtils.ConstructPacket(KNetUtils.PacketType.bufferedObject, serializedField);
             SendBytes(newClient, packet);
         }
     }
 }
예제 #2
0
 public void Execute()
 {
     if (RpcInfo == null)
     {
         KNetLogger.LogError("KNetRpc: Cound not execute: RpcInfo is null.");
     }
     RpcInfo.methodInfo.Invoke(RpcInfo.kNetView, Arguments);
 }
예제 #3
0
        internal static object Deserialize(byte[] kNetSerialized, int count, SerializableType serializedType, Type objRealType)
        {
            MemoryStream    ms = new MemoryStream(kNetSerialized);
            BinaryFormatter bf = new BinaryFormatter();

            if (serializedType == 0)
            {
                KNetLogger.LogError($"KNetClient: could not Recieve buffered object: could not deserialize field {objRealType.Name}: Type not supported");
                return(null);
            }
            if (serializedType == SerializableType.primitive)
            {
                return(bf.Deserialize(ms));
            }
            else if (serializedType == SerializableType.kNetSerializable)
            {
                return(typeof(IKNetSerializable).GetMethod("KNetDeserialize")
                       .Invoke(Activator.CreateInstance(objRealType), new object[] { kNetSerialized }));
            }
            else if (serializedType == SerializableType.array)
            {
                List <byte[]> serialized   = (List <byte[]>)bf.Deserialize(ms);
                var           elemType     = objRealType.GetElementType();
                var           deserialized = Array.CreateInstance(elemType, count);
                int           index        = 0;
                for (int i = 0; i < count; i++)
                {
                    object deserializedObject = typeof(IKNetSerializable).GetMethod("KNetDeserialize")
                                                .Invoke(Activator.CreateInstance(elemType), new object[] { serialized[i] });

                    deserialized.SetValue(deserializedObject, index);
                    index++;
                }
                return(deserialized);
            }
            else if (serializedType == SerializableType.list)
            {
                List <byte[]> serialized   = (List <byte[]>)bf.Deserialize(ms);
                var           genArgType   = objRealType.GetGenericArguments()[0];
                var           deserialized = Activator.CreateInstance(typeof(List <>).MakeGenericType(genArgType), count);
                var           listType     = deserialized.GetType();
                for (int i = 0; i < count; i++)
                {
                    object deserializedObject = typeof(IKNetSerializable).GetMethod("KNetDeserialize")
                                                .Invoke(Activator.CreateInstance(genArgType), new object[] { serialized[i] });

                    listType.GetMethod("Add").Invoke(deserialized, new object[] { deserializedObject });
                }
                return(deserialized);
            }
            return(null);
        }
예제 #4
0
        public static int AddView(KNetView view)
        {
            if (IsServer == false)
            {
                KNetLogger.LogError("KlivenNet.AddView() is only available on Server. On clients Views are synchronized automatically.");
                return(-1);
            }
            int id = Views.Count;

            view.Init(id);
            Views.Add(view);
            return(id);
        }
예제 #5
0
        internal static void RecieveBufferedObject(KNetSerializedField serializedField)
        {
            KNetView view = KlivenNet.FindView(serializedField.viewId);

            if (view == null)
            {
                KNetLogger.LogError($"KNetClient: could not Recieve buffered object: KNetView of id {serializedField.viewId}: view does not exist.");
                return;
            }
            var field = serializedField.fieldId < view.BufferedFields.Length ? view.BufferedFields[serializedField.fieldId] : null;

            if (field == null)
            {
                KNetLogger.LogError($"KNetClient: could not Recieve buffered object: KNetView of id {serializedField.viewId}: field id {serializedField.fieldId} is not defined.");
                return;
            }
            field.SetValue(view, KNetUtils.Deserialize(serializedField.data, serializedField.count
                                                       , KNetUtils.IsSerializable(field.FieldType), field.FieldType));
        }