public static String ToXMLString(GameResult gameResult)
        {
            String result = "<gameResult isNull=\"";
            if (gameResult == null)
                result += "true\"";
            else
            {
                result += "false\"";
                result += " result=\"" + (gameResult.isWinner() ? "winner" : "looser") + "\"";
            }

            result += "/>";
            return result;
        }
 public GamePacket(GameResult result)
 {
     this.gameResult = result;
     type = TYPE.GAME_RESULT;
 }
        public static GamePacket deserialize(String packetString)
        {
            GamePacket packet = null;
            GamePacket.TYPE type = GamePacket.TYPE.UNDEFINED;
            String message = null;
            Coordinates coordinates = null;
            bool whoStarts = false;
            ShotResult shotResult = null;
            GameResult gameResult = null;
            bool[,] matrix = null;
            bool isHit = false;
            bool isSunk = false;
            bool isGameEnded = false;

            XmlTextReader textReader = new XmlTextReader(new StringReader(packetString));
            textReader.Read();
            //Console.WriteLine("deserialization is ready to start:\n" + packetString);
            while (textReader.Read())
            {
                if (textReader.NodeType == XmlNodeType.Element)
                {
                    if (textReader.Name.Equals("gamePacket"))
                    {
                        String typeString = textReader.GetAttribute("type");
                        if (typeString.Equals("WHO_STARTS"))
                        {
                            type = GamePacket.TYPE.WHO_STARTS;
                            whoStarts = textReader.GetAttribute("whoStarts").Equals("host") ? Global.HOST_FIRST : Global.CLIENT_FIRST;
                            packet = new GamePacket(whoStarts);
                        }
                        else if (typeString.Equals("TEXT_MESSAGE"))
                        {
                            type = GamePacket.TYPE.TEXT_MESSAGE;
                            message = textReader.GetAttribute("message");
                            packet = new GamePacket(message);
                        }
                        else if (typeString.Equals("SHOT"))
                        {
                            type = GamePacket.TYPE.SHOT;
                        }
                        else if (typeString.Equals("RESULT"))
                        {
                            type = GamePacket.TYPE.RESULT;
                        }
                        else if (typeString.Equals("GAME_RESULT"))
                        {
                            type = GamePacket.TYPE.GAME_RESULT;
                        }
                    }
                    else if (textReader.Name.Equals("shotResult") && textReader.GetAttribute("isNull").Equals("false"))
                    {
                        isHit = Boolean.Parse(textReader.GetAttribute("isHit"));
                        isSunk = Boolean.Parse(textReader.GetAttribute("isSunk"));
                        isGameEnded = Boolean.Parse(textReader.GetAttribute("isGameEnded"));
                        String matrixStr = textReader.GetAttribute("matrix");
                        if (!matrixStr.Equals("null"))
                            matrix = Global.stringToBoolArray(matrixStr);
                    }
                    else if (textReader.Name.Equals("coordinates") && textReader.GetAttribute("isNull").Equals("false"))
                    {
                        int x = Int32.Parse(textReader.GetAttribute("x"));
                        int y = Int32.Parse(textReader.GetAttribute("y"));
                        coordinates = Coordinates.Get(x, y);
                    }
                    else if (textReader.Name.Equals("gameResult") && textReader.GetAttribute("isNull").Equals("false"))
                    {
                        gameResult = new GameResult(textReader.GetAttribute("result").Equals("winner") ? Global.GAME_RESULT_WINNER : Global.GAME_RESULT_LOOSER);
                    }
                }
                else if (textReader.NodeType == XmlNodeType.EndElement)
                {
                    if (textReader.Name.Equals("gamePacket"))
                    {
                        switch (type)
                        {
                            case GamePacket.TYPE.GAME_RESULT:
                                packet = new GamePacket(gameResult);
                                break;
                            case GamePacket.TYPE.RESULT:
                                packet = new GamePacket(shotResult);
                                break;
                            case GamePacket.TYPE.SHOT:
                                packet = new GamePacket(coordinates);
                                break;
                            case GamePacket.TYPE.TEXT_MESSAGE:
                                packet = new GamePacket(message);
                                break;
                            case GamePacket.TYPE.WHO_STARTS:
                                packet = new GamePacket(whoStarts);
                                break;
                            default:
                                break;
                        }
                    }
                    else if (textReader.Name.Equals("shotResult"))
                    {
                        shotResult = new ShotResult(isHit, isSunk, isGameEnded, coordinates, matrix);
                    }
                }
            }

            return packet;
        }