public HousingSlotSnapshotJSONObject ToJsonObject()
        {
            HousingSlotSnapshotJSONObject ret = new HousingSlotSnapshotJSONObject();

            ret.area   = HousingItem.GetHouseAreaStr(Area);
            ret.server = ServerId;
            ret.slot   = Slot;
            ret.time   = new DateTimeOffset(Time).ToUnixTimeSeconds();

            List <HousingItemJSONObject> houseListJson = new List <HousingItemJSONObject>();

            foreach (var house in HouseList.Values)
            {
                houseListJson.Add(house.ToJsonObject());
            }

            ret.houses = houseListJson.ToArray();

            return(ret);
        }
        void NetworkReceived(string connection, long epoch, byte[] message)
        {
            var opcode = BitConverter.ToUInt16(message, 18);

            if (opcode != 0x164 && message.Length != 2440)
            {
                return;
            }
            HousingSlotSnapshot snapshot;

            try
            {
                //解析数据包
                snapshot          = new HousingSlotSnapshot(message);
                snapshot.ServerId = GetServerId();

                /*foreach(var house in snapshot.HouseList.Values)
                 * {
                 *  Log("Debug", house.Id + ": " + house.Flags.ToString());
                 * }*/
                //存入存储
                SnapshotStorage.Insert(snapshot);
                AutoUploadSnapshot[new Tuple <HouseArea, int>(snapshot.Area, snapshot.Slot)] = snapshot;

                foreach (HousingOnSaleItem item in HousingList)
                {
                    if (item.Area == snapshot.Area && item.Slot == snapshot.Slot)
                    {
                        item.CurrentStatus = false;
                    }
                }

                HousingItem[] onSaleList = snapshot.GetOnSale();

                Monitor.Enter(this);
                foreach (var item in HousingList)
                {
                    if (item.Area == snapshot.Area && item.Slot == snapshot.Slot)
                    {
                        if (onSaleList.Where(x => x.Slot == item.Slot && x.IsEmpty)
                            .ToArray().Length == 0)
                        {
                            //空房已消失
                            item.CurrentStatus = false;
                            HousingListUpdated = true;
                            try
                            {
                                bindingSource1.ResetItem(HousingList.IndexOf(item));
                            }
                            catch (Exception ex)
                            {
                                Log("Error", ex, "刷新列表出错:");
                            }
                        }
                    }
                }

                int listIndex;
                //更新空房列表
                foreach (HousingItem house in onSaleList)
                {
                    HousingOnSaleItem onSaleItem = new HousingOnSaleItem(house);
                    Log("Info", string.Format("{0} 第{1}区 {2}号 {3}房在售 当前价格: {4}",
                                              onSaleItem.AreaStr, onSaleItem.DisplaySlot, onSaleItem.DisplayId,
                                              onSaleItem.SizeStr, onSaleItem.Price));

                    if (onSaleItem.Size == HouseSize.M || onSaleItem.Size == HouseSize.L)
                    {
                        Console.Beep(3000, 1000);
                    }

                    if ((listIndex = HousingList.IndexOf(onSaleItem)) != -1)
                    {
                        HousingList[listIndex].Update(house);
                        Log("Info", "重复土地,已更新。");
                    }
                    else
                    {
                        bindingSource1.Add(onSaleItem);
                    }
                    HousingListUpdated = true;
                }
                LastOperateTime = new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds(); //更新上次操作的时间

                Log("Info", string.Format("{0} 第{1}区查询完成",
                                          HousingItem.GetHouseAreaStr(snapshot.Area),
                                          snapshot.Slot + 1)); //输出翻页日志
                Monitor.Exit(this);
            }
            catch (Exception ex)
            {
                Log("Error", ex, "查询房屋列表出错:");
                return;
            }
        }