ServiceStack.文本反序列化包含空条目的数组不正确

本文关键字:数组 不正确 文本 反序列化 包含空 ServiceStack | 更新日期: 2023-09-27 18:16:09

我正在为自己创造的iOS游戏创建自己的后端。游戏目前使用game Center,但我想把它移植到其他平台,所以我需要一些不同的东西。我使用ServiceStack和OrmLite与MySQL数据库来存储游戏数据。我遇到的问题是,游戏数据的一个类包含一个数组。这是一款棋盘游戏,所以我使用锯齿数组来存储所有的棋盘方块,或者是那个位置的棋子,或者是没有棋子的空值。当我反序列化Board类时,所有的空值都被替换为默认的Piece类。

public class Piece
{
    public PieceColor Color { get; set; }
    public PieceType Type { get; set; }
    public Piece (PieceColor newColor, PieceType newType)
    {
        Color = newColor;
        Type = newType;
    }
}

PieceColor和PieceType都是枚举,当反序列化并获得一个应该为空的PIece对象时,它们都被初始化为0值,给出枚举中的第一项。

public class Board {
    public Piece[][] Layout { get; set; }
    public bool SingleMove { get; set; }
    public bool WeakHnefi { get; set; }
    public List<Move> MoveHistory { get; set; }
    public Move CurrentMove { get; set; }
    public int BoardSize { get; set; }
    public Variation Variation { get; set; }
    [IgnoreDataMember]
    public Move LastMove {
        get {
            return MoveHistory.Last ();
        }
    }
}

布局属性是我有问题的数组。它最初是一个多维数组,尝试将其更改为锯齿数组,看看它是否对反序列化产生影响。它没有。Board类还有更多,各种方法和一个带几个参数的构造函数。我尝试创建一个空的无参数构造函数,一个初始化一些属性的无参数构造函数,以及没有无参数构造函数。无论我做什么,我都不能使Layout属性正确地反序列化。

public class Game {
    public Board Board { get; set; }
    public Variation Variation { get; set; }
    public PieceColor CurrentTurn { get; set; }
    public PieceColor WinningColor { get; set; }
    public Position SelectedPiece { get; set; }
    public bool GameOver { get; set; }
    public int SquareSize { get; set; }
    public int BorderSize { get; set; }
    public string ImageName { get; set; }
    public bool IsTablet { get; set; }
    [IgnoreDataMember]
    public PieceColor Opponent {
        get {
            if (CurrentTurn == PieceColor.White)
                return PieceColor.Red;
            else
                return PieceColor.White;
        }
    }
}

实际被序列化并存储在数据库列中的游戏类。据我所知,这个类中的其他所有内容(以及Board中除了layout之外的所有内容)都是正确反序列化的,只是不是一个数组。

数据库中序列化Game类的例子:

{"Board":{"Layout":[[{},{},{},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{},{},{}],[{},{},{},{},{},{"Color":"Red","Type":"Hunn"},{},{},{},{},{}],[{},{},{},{},{},{},{},{},{},{},{}],[{"Color":"Red","Type":"Hunn"},{},{},{},{},{"Color":"White","Type":"Hunn"},{},{},{},{},{"Color":"Red","Type":"Hunn"}],[{"Color":"Red","Type":"Hunn"},{},{},{},{"Color":"White","Type":"Hunn"},{"Color":"White","Type":"Hunn"},{"Color":"White","Type":"Hunn"},{},{},{},{"Color":"Red","Type":"Hunn"}],[{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{},{"Color":"White","Type":"Hunn"},{"Color":"White","Type":"Hunn"},{"Color":"White","Type":"Hnefi"},{"Color":"White","Type":"Hunn"},{"Color":"White","Type":"Hunn"},{},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"}],[{"Color":"Red","Type":"Hunn"},{},{},{},{"Color":"White","Type":"Hunn"},{"Color":"White","Type":"Hunn"},{"Color":"White","Type":"Hunn"},{},{"Color":"Red","Type":"Hunn"},{},{}],[{"Color":"Red","Type":"Hunn"},{},{},{},{},{"Color":"White","Type":"Hunn"},{},{},{},{},{"Color":"Red","Type":"Hunn"}],[{},{},{},{},{},{},{},{},{},{},{}],[{},{},{},{},{},{"Color":"Red","Type":"Hunn"},{},{},{},{},{}],[{},{},{},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{"Color":"Red","Type":"Hunn"},{},{},{}]],"SingleMove":false,"WeakHnefi":false,"MoveHistory":[{"Piece":{"Color":"Red","Type":"Hunn"},"BeforeMove":{"X":6,"Y":10},"AfterMove":{"X":6,"Y":8},"PiecesCaptured":[],"CapturedSquares":[]}],"BoardSize":11,"Variation":"Hnefatafl"},"Variation":"Hnefatafl","CurrentTurn":"White","WinningColor":"White","SelectedPiece":{"X":6,"Y":10},"GameOver":false,"SquareSize":28,"BorderSize":1,"ImageName":"Eleven.png","IsTablet":false}

序列化/反序列化正在由OrmLite/ServiceStack处理。文本时,我插入/检索条目从数据库。我这辈子都不知道问题出在哪里,也不知道怎么解决,而且也没有找到任何答案。

ServiceStack.文本反序列化包含空条目的数组不正确

ServiceStack不支持锯齿数组或多维数组,您将不得不使用其他集合,如List<List<int>>