//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); } } }
public void Execute() { if (RpcInfo == null) { KNetLogger.LogError("KNetRpc: Cound not execute: RpcInfo is null."); } RpcInfo.methodInfo.Invoke(RpcInfo.kNetView, Arguments); }
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); }
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); }
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)); }