<div>Hey Guys'n Gals.. </div>
<div> </div>
<div>Digging into Bug number 145 on Mantis.. I discovered profuse and prolific use of the unserializable LLUUID in inventory.. It's used *everywhere*. </div>
<div> </div>
<div>It's no wonder inventory is spotty and error prone!</div>
<div> </div>
<div>It's used in InventoryFolderBase</div>
<div>It's used in InventoryItemBase</div>
<div>It's used in the REST calls</div>
<div>All of this data is being transferred over Grid Communications :/</div>
<div> </div>
<div>Once again, I restate that the LLUUID is no longer serializable. It now implements the IComparable interface which is *not* serializable.. Therefore, it can 'never' be used in any grid communications, period.
</div>
<div> </div>
<div>We all need to take a good look at the grid inventory service and 'fix' all uses of LLUUID.</div>
<div> </div>
<div>It's *really* easy to use a Guid instead. </div>
<div> </div>
<div>To go from a System.Guid to a LLUUID, you instantiate a new LLUUID and pass the Guid to it's constructor. </div>
<div>ex:</div>
<div> </div>
<div>Guid gAgentID = 'xxxxxxx-xx-x--x-x--xx';</div>
<div> </div>
<div>LLUUID AgentID = new LLUUID(gAgentID);</div>
<div> </div>
<div> </div>
<div>To go from a LLUUID to a guid, you use the UUID property of the LLUUID.</div>
<div>ex:</div>
<div> </div>
<div>Guid gAgentID = AgentID.UUID;</div>
<div> </div>
<div>So, given that you've got a userID LLUUID.. to get it over grid communications reliably.. you have to turn it into a Guid.</div>
<div> </div>
<div>requester.BeginPostObject<<strong>Guid</strong>>(_inventoryServerUrl + "/GetInventory/", <strong>userID.UUID</strong>);</div>
<div> </div>
<div>Then on the receiving side, </div>
<div> </div>
<div> httpServer.AddStreamHandler(<br> new RestDeserialisehandler<<strong>Guid</strong>, InventoryCollection>("POST", "/GetInventory/",<br> m_inventoryService.GetUserInventory));
</div>
<div> </div>
<div>public InventoryCollection GetUserInventory(<strong>Guid userID</strong>)<br> {<br> InventoryCollection invCollection = new InventoryCollection();<br> List<InventoryFolderBase> folders;
<br> List<InventoryItemBase> allItems;<br> if (TryGetUsersInventory(<strong>new LLUUID(userID),</strong> out folders, out allItems))<br> {<br> invCollection.AllItems = allItems;
<br> invCollection.Folders = folders;<br> invCollection.UserID = <strong>new LLUUID(userID);</strong><br> }<br> return invCollection;<br> }</div>
<div> </div>
<div>Additionally, </div>
<div>Any object that encapsulates a LLUUID directly, is NOT serializable... that means.. the objects;</div>
<div> </div>
<div>InventoyFolderBase</div>
<div>and </div>
<div>InventoryItemBase</div>
<div> </div>
<div>Are not serializable because they encapsulate LLUUIDs. This is *bad* :D. They cannot go over Grid Communications reliably.</div>
<div> </div>
<div>They all need to be changed to Guids, or we'll continue to have spotty inventory.</div>
<div> </div>
<div> :D</div>
<div> </div>
<div>I'm mentioning this because it's a big problem.. </div>
<div> </div>
<div>I don't really know this portion of the code well.. so if I edit it, it's likely to break.. hence the subject.</div>
<div> </div>
<div>Someone take this on please.. so I don't have to chop it up with a chainsaw.. grind it down with a tree stump grinder, run it over with a steam roller and jack-hammer it to itty bitty bite sized serializable components that can reliably be transferred over grid communications. :D
</div>
<div> </div>
<div>Best Regards </div>
<div> </div>
<div>Tera</div>