Serialization options & performance

escjosh
edited March 2012 in Photon Server
I wanted to use the following kind of code for serializing types between servers, but I discovered that this API is not available on the client.
private static IRpcProtocol serializingProtocol;
private static byte[] SerializeFriend( object o )
{
	var f = (Friend)o;
	var ms = new MemoryStream();
	serializingProtocol.Serialize( ms, f.Id );
	serializingProtocol.Serialize( ms, f.Status );
	serializingProtocol.Serialize( ms, f.Server );
	serializingProtocol.Serialize( ms, f.Character );
	serializingProtocol.Serialize( ms, f.Level );
	return ms.ToArray();
}

private static Friend DeserializeFriend( byte[] bytes )
{
	var ms = new MemoryStream( bytes, false );
	return new Friend
	{
		Id = Deserialize<string>( ms ),
		Status = Deserialize<UserStatus>( ms ),
		Server = Deserialize<string>( ms ),
		Character = Deserialize<string>( ms ),
		Level = Deserialize<byte>( ms )
	};
}

private static T Deserialize<T>( MemoryStream ms )
{
	object o;
	serializingProtocol.TryParse( ms, out o );
	return (T)o;
}

To avoid maintaining two sets of serialization functions, I'm considering using the client version of the code on the server as well:
private static byte[] SerializeFriend( object o )
{
	var f = (Friend)o;
	var ms = new MemoryStream();
	var writer = new BinaryWriter( ms );
	writer.Write( f.Id );
	writer.Write( (byte)f.Status );
	writer.Write( f.Character );
	writer.Write( f.Server );
	writer.Write( f.Level );
	return ms.ToArray();
}

private static Friend DeserializeFriend( byte[] bytes )
{
	var ms = new MemoryStream( bytes, false );
	var reader = new BinaryReader( ms );
	var f = new Friend
	{
		Id = reader.ReadString(),
		Status = (UserStatus)reader.ReadByte(),
		Server = reader.ReadString(),
		Character = reader.ReadString(),
		Level = reader.ReadByte()
	};
	return f;
}

I can't see how Serialize is implemented on the server so I'm not sure what the performance differences would be. Does it seem OK to use the second implementation (with BinaryWriter) on the back-end where these functions may be called many times per second?

Thanks

Comments

  • The second implementation is the faster one and also produces less network traffic.