/// <summary> /// 序列化 /// </summary> /// <returns>The encode.</returns> /// <param name="val">要序列化的对象</param> public static GenericCollectionValue Serialize(object val) { GenericCollectionValue genericVal = null; if (val is null) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Null }; } else if (val is byte[]) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Bytes, BytesValue = ByteString.CopyFrom((byte[])val) }; } else if (val is byte) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Byte, IntValue = (byte)val }; } else if (val is short) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Short, IntValue = (short)val }; } else if (val is int) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Int, IntValue = (int)val }; } else if (val is long) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Long, LongIntValue = (long)val }; } else if (val is bool) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Bool, BoolValue = (bool)val }; } else if (val is float) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Float, FloatValue = (float)val }; } else if (val is double) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Double, DoubleValue = (double)val }; } else if (val is string) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.String, StringValue = (string)val }; } else if (val is PlayObject playObject) { var bytes = SerializePlayObject(playObject); genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Map, BytesValue = ByteString.CopyFrom(bytes) }; } else if (val is PlayArray playArray) { var collection = new GenericCollection(); foreach (object obj in playArray) { collection.ListValue.Add(Serialize(obj)); } genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Array, BytesValue = collection.ToByteString() }; } else { var type = val.GetType(); if (typeDict.TryGetValue(type, out var customType)) { genericVal = new GenericCollectionValue { Type = GenericCollectionValue.Types.Type.Object, ObjectTypeId = customType.TypeId, BytesValue = ByteString.CopyFrom(customType.SerializeMethod(val)) }; } else { throw new Exception($"{type} is not supported"); } } return(genericVal); }
/// <summary> /// 反序列化 /// </summary> /// <returns>The decode.</returns> /// <param name="genericValue">带类型的序列化对象</param> public static object Deserialize(GenericCollectionValue genericValue) { object val = null; switch (genericValue.Type) { case GenericCollectionValue.Types.Type.Null: // val = null; break; case GenericCollectionValue.Types.Type.Bytes: val = genericValue.BytesValue.ToByteArray(); break; case GenericCollectionValue.Types.Type.Byte: val = (byte)genericValue.IntValue; break; case GenericCollectionValue.Types.Type.Short: val = (short)genericValue.IntValue; break; case GenericCollectionValue.Types.Type.Int: val = genericValue.IntValue; break; case GenericCollectionValue.Types.Type.Long: val = genericValue.LongIntValue; break; case GenericCollectionValue.Types.Type.Bool: val = genericValue.BoolValue; break; case GenericCollectionValue.Types.Type.Float: val = genericValue.FloatValue; break; case GenericCollectionValue.Types.Type.Double: val = genericValue.DoubleValue; break; case GenericCollectionValue.Types.Type.String: val = genericValue.StringValue; break; case GenericCollectionValue.Types.Type.Map: val = DeserializePlayObject(genericValue.BytesValue); break; case GenericCollectionValue.Types.Type.Array: { PlayArray playArray = new PlayArray(); var collection = GenericCollection.Parser.ParseFrom(genericValue.BytesValue); foreach (var element in collection.ListValue) { playArray.Add(Deserialize(element)); } val = playArray; } break; case GenericCollectionValue.Types.Type.Object: { // 自定义类型 var typeId = genericValue.ObjectTypeId; if (typeIdDict.TryGetValue(typeId, out var customType)) { val = customType.DeserializeMethod(genericValue.BytesValue.ToByteArray()); } else { throw new Exception($"type id: {typeId} is not supported"); } } break; default: // 异常 throw new Exception($"{genericValue.Type} is not supported"); } return(val); }