public static void SerializeList <T>(this BitStream bs, ref List <T> list, SerializeCallback <T> serializer) { if (bs.Writing) { T item; bs.WriteVariant((uint)list.Count); for (int i = 0; i < list.Count; i++) { item = list[i]; serializer(bs, ref item); } } else { T item = default(T); int count = (int)bs.ReadUInt32Variant(); list = list ?? new List <T>(count); list.Clear(); for (int i = 0; i < count; i++) { serializer(bs, ref item); list.Add(item); } } }
static void Serialize <T>(this BitStream bs, T[] data, int len, SerializeCallback <T> serializer) { for (int i = 0; i < len; i++) { serializer(bs, ref data[i]); } }
protected AGSScriptManagedObject(string type) { this.typeName = Marshal.StringToHGlobalAnsi(type); this.disposeCallback = this.Dispose; this.getTypeCallback = (() => this.typeName); this.serializeCallback = this.Serialize; this.Handle = NativeMethods.ScriptManagedObject_Create( Marshal.GetFunctionPointerForDelegate(this.disposeCallback), Marshal.GetFunctionPointerForDelegate(this.getTypeCallback), Marshal.GetFunctionPointerForDelegate(this.serializeCallback)); }
private string SerializeArray(IEnumerable objs, SerializeCallback sc) { var elements = ""; foreach (var obj in objs) { elements += sc(obj); } return("<array>" + elements + "</array>"); }
/// <summary> /// 注册序列化回调函数。 /// </summary> /// <param name="version">序列化回调函数的版本。</param> /// <param name="callback">序列化回调函数。</param> public void RegisterSerializeCallback(byte version, SerializeCallback callback) { if (callback == null) { throw new GXException("Serialize callback is invalid."); } m_SerializeCallbacks[version] = callback; if (version > m_LatestSerializeCallbackVersion) { m_LatestSerializeCallbackVersion = version; } }
/// <summary> /// 序列化数据到目标流中。 /// </summary> /// <param name="stream">目标流。</param> /// <param name="data">要序列化的数据。</param> /// <param name="version">序列化回调函数的版本。</param> /// <returns>是否序列化数据成功。</returns> public bool Serialize(Stream stream, T data, byte version) { byte[] header = GetHeader(); stream.WriteByte(header[0]); stream.WriteByte(header[1]); stream.WriteByte(header[2]); stream.WriteByte(version); SerializeCallback callback = null; if (!m_SerializeCallbacks.TryGetValue(version, out callback)) { throw new GameFrameworkException(Utility.Text.Format("Serialize callback '{0}' is not exist.", version.ToString())); } return(callback(stream, data)); }
/// <summary> /// 序列化数据到目标流中。 /// </summary> /// <param name="stream">目标流。</param> /// <param name="data">要序列化的数据。</param> /// <param name="version">序列化回调函数的版本。</param> /// <returns>序列化数据是否成功。</returns> public bool Serialize(Stream stream, T data, byte version) { using (BinaryWriter binaryWriter = new BinaryWriter(stream, Encoding.UTF8)) { byte[] header = GetHeader(); binaryWriter.Write(header[0]); binaryWriter.Write(header[1]); binaryWriter.Write(header[2]); binaryWriter.Write(version); SerializeCallback callback = null; if (!m_SerializeCallbacks.TryGetValue(version, out callback)) { throw new GXException(Utility.Text.Format("Serialize callback '{0}' is not exist.", version.ToString())); } return(callback(binaryWriter, data)); } }