I don’t have my code in front of me, but I take a different approach. It’s been working well so far.
Basically, I have different datapackets that I used to communicate between the clients and server. Each datapacket communicates a specific thing from the server to the client, or from the client to the server. For example, I have
SC_AddItemToContainer → Tells all clients that an item is being added to a container.
So, let’s say that the server has added a sword to a container. The container is your inventory.
All items have a unique id, an integer. This sword’s happens to be 1235. The container happens to be you (your inventory), your unique is as 45.
I have a big ServerMessenger class, with a method like this:
public void ClientsAddItemToContainer(int itemId, int containerId)
{
SC_AddItemToContainer dataPacket = new SC_AddItemToContainer(itemId, containterId);
SocketComm.SendToAll(dataPacket); // This sends the datapackets to everyone.
}
Ok, sorry…I know this is sorta long winded…I’m getting there 
The SC_AddItemToContainer datapacket inherets from the DataPacket class. The datapacket class has a Serialize and DeSerialize method that the subclasses override.
The SC_AddItemToContainer datapacket subclass implements it like this:
public void Serialize(BinaryWriter writer)
{
writer.write(_ItemId);
writer.write(_ContainerId);
}
public void DeSerialize(BinaryReader reader)
{
_ItemId = reader.ReadInt32();
_ContainerId = reader.ReadInt32();
}
So basically…each datapacket knows how to serialize and deserialize its content. I don’t use reflection.
I think this works ok because…I don’t use polymorphism for game items, in my project. Neither my server OR client have any clue what a sword is. There is no sword class, and an IronSword class that inherits from a sword class, and a FancyIronSword class that inherits from the IronSword class. At the core, I have an Entity class. This holds things that are common to all items:
Position
OwnerId
Health
Quality
Weight
Damage
and so on
Nothing really inherit from Entity. Everything in the game is pretty much an entity, and can be communicated the same way.
All the properties of items are stored in a database, and loaded at server startup.
So how to different items do different things, if their data is so generic? Simple…abilities are assigned to items, and THOSE have specific features. That way I can assign a Chop that goes to all axes (the axe family). Or, I can make specific items have very unique abilities. The Glowing Sword of Goblin Fire may actually shoot a fireball, if the fireball ability is assigned to that specific type of sword.
Client selects “Fireball” ability assigned to a wand, and attacks.
The server knows about all abilites (drop is a transfer from a container to the world). Lead is a rope ability, an entity should follow another entity. Chop is a hatchet ability, causes damage on the target. So ability validation and determining the result actually happens on the server. Each ability has an effect assigned to it, the effect decides things like animation played, sound, result, etc.
What animations/effects to perform for abilities are determined by the client, because all abilities have an EFFECT id assigned.
So, the Fire wand may have a Small Fireball ability assigned. When players select that, the client sends a request to the server to perform that ability. At the same time, the client starts playing the animation.
Meanwhile, the server determines the outcome of the ability (sad goblin gets hit for 100 dmg) and queues up the results to happen 2 seconds in the future (it takes 2 secs for it to reach sad goblin, based on speed).
When those 2 seconds pass, server sends out a SC_ReduceEntityHealth damagepacket, with the goblin id attached. Or if its dead, server tells the clients to kill the poor goblin.
Generally…I stay away from polymorphism in a situation like this unless I really have to. For my project…the server doesn’t have a sword class, or a shield class.
Instead, an iron sword is just an entity with weight, value, quality, a unique id, an owner. It adds 0 armor when equipped. It can be equipped in the hands slots.
It has these abilities assigned to it:
Thrust
Slash
The Thrust ability does 5 physical damage, melee distance.
The Thrust effect is a combination of the ability, player, sword and effect stats. The player will play a Thrust animation, and reduce the target’s health by X amount as a result.
The server queues up the effect to happen based on how long it should take to perform (or hit its target). The server can compensate for latency in this. So if a fireball should hit your goblin 5 seconds (ok, its a slow fireball) from now, and player latency is 1 second, the server queues it up to happen 4 seconds from now instead.
I’m still working on this system, so it’s not 100% complete.
Well, I hope that big rambling post was somewhat useful! Good luck on your project, I know several of us have been working on the same type of thing.