I am not sure you can actually store a complex object in the CommandArgument as it seems to only take string or numeric values.
Something, which I have never really put into practice, is to convert your object into a Json string and use this as your command argument.
For example, using Newtonsoft.Json and a dummy object called FooBar
<asp:Button ID="btnOne" runat="server"
CommandName="Click"
CommandArgument='<%#Newtonsoft.Json.JsonConvert.SerializeObject((FooBar)Container.DataItem) %>'
Text="Click" />
Then when you handle the GridView RowCommand click event, you can Deserialize the object from the CommandArgument
FooBar fooBar = Newtonsoft.Json.JsonConvert.DeserializeObject<FooBar>(e.CommandArgument.ToString());
Now this works, but whether it is the best solution, I am not sure.