JsonConvert.DeserializeObject 加载数据类型但不加载数据值

JsonConvert.DeserializeObject loading data types but not data values

我的程序为用户提供了序列化特定列表 List<Position>ListPosition 的选项,该列表存储来自 class 位置的数据。它确实序列化得很好,看起来像下面这样

{
    "PosZ": 0,
    "PosX": 749,
    "PosY": 208,
    "Agent": {
      "IsEdgeTree": false,
      "ThisTreesCreator": null,
      "Type": 0,
      "Colour": "Green",
      "Dimension": 25
    }
  },
  {
    "PosZ": 0,
    "PosX": 724,
    "PosY": 183,
    "Agent": {
      "IsEdgeTree": false,
      "ThisTreesCreator": {
        "IsEdgeTree": false,
        "Position": {
          "PosZ": 0,
          "PosX": 749,
          "PosY": 208
        },
        "ThisTreesCreator": null,
        "Type": 0,
        "Colour": "Green",
        "Dimension": 25
      },
      "Type": 0,
      "Colour": "Green",
      "Dimension": 25
    }
  },

这些只是几个例子。

给我反序列化的问题。

当我检查转换它的代码位 JsonConvert.DeserializeObject<List<Position>>(JsonString); 时,一切都很好,但是,当我将它与列表相等时,我试图将数据转储到 AKA 序列化数据来自的同一个列表但为空,数据未加载,我只剩下正确的结构但没有值。

Values not showing up

为了反序列化,我从另一个 Windows 表单调用了以下方法:

public static void Deserialize()
        {
            if (Directory.Exists("Serialized"))
            {
                var FileName = "Serialized/PositionsSerialized_4.json";
                var JsonString = File.ReadAllText(FileName);                
                ListPositions = JsonConvert.DeserializeObject<List<Position>>(JsonString);
            }
            else
                MessageBox.Show("There's no directory");
        }

非常感谢您的帮助。如果需要更多信息,请务必在评论中提出要求。 谢谢你的时间。

public class Position
    {
        public static int MaxX { get; private set; }
        public static int MaxY { get; private set; }

        public static List<Position> ListPositions { get; private set; }
        public static List<Position> ListTreePositions {
            get
            {
                return ListPositions.Where(w => w.Agent?.Type == AgentType.Tree).ToList();
            }
        }
        public static List<Position> ListDronePositions
        {
            get
            {
                return ListPositions.Where(w => w.Agent?.Type == AgentType.Drone).ToList();
            }
        }
        public int PosX { get; private set; }
        public int PosY { get; private set; }
        public int PosZ;
        private static object services;

        public Agent Agent { get; private set; }

        public Position()
        {
            ListPositions = new List<Position>();
        }

        public static void SetMaxValues(int maxX, int maxY)
        {
            MaxX = maxX;
            MaxY = maxY;
        }

        public void FillNeighbours(int posX, int posY, int dim)
        {
            for (int i = 0; i < dim; i++)
            {
                for (int y = 0; y < dim; y++)
                {
                    new Position(posX - (dim - y), posY - (dim - i), Agent);
                }
            }
        }
        public static Position CreateNewRandomPosition()
        {
            Random rnd = new Random();
            int rndX;
            int rndY;
            Position position = null;
            while (position == null)
            {
                rndX = rnd.Next(MaxX - 100);
                rndY = rnd.Next(MaxY - 100);
                position = CreatePosition(rndX, rndY);
            }
            return position;
        }

        public static Bitmap ExportBitmap()
        {
            return ExportBitmap(0, 0, MaxX, MaxY, ListPositions);
        }
        public static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY)
        {
            var listPositions = ListPositions.Where(w => (w.Agent != null) && (w.PosX >= posX && w.PosX <= maxX) && (w.PosY >= posY && w.PosY <= maxY)).ToList();
            return ExportBitmap(posX, posY, maxX, maxY, listPositions);
        }
        public static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY, AgentType agentType)
        {
            var listPositions = ListPositions.Where(w => (w.Agent.Type == agentType) && (w.PosX >= posX && w.PosX <= maxX) && (w.PosY >= posY && w.PosY <= maxY)).ToList();
            return ExportBitmap(posX, posY, maxX, maxY, listPositions);
        }
        public static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY, AgentType[] agentType)
        {
            var listPositions = ListPositions.Where(w => (agentType.Contains(w.Agent.Type)) && (w.PosX >= posX && w.PosX <= maxX) && (w.PosY >= posY && w.PosY <= maxY)).ToList();
            return ExportBitmap(posX, posY, maxX, maxY, listPositions);
        }
        private static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY, List<Position> positions)
        {
            Bitmap bmp = new Bitmap(maxX - posX, maxY - posY);
            if (Agent.Sprites.Count() == 0)
            {
                Agent.LoadSprites();
            }
            Graphics g = Graphics.FromImage(bmp);

            foreach (var item in positions)
            {
                var SpriteWidth = Agent.Sprites[item.Agent.Type].Width / 2;
                var SpriteHeight = Agent.Sprites[item.Agent.Type].Height / 2;
                g.DrawImage(Agent.Sprites[item.Agent.Type], new Point(item.PosX - SpriteWidth - posX, item.PosY - SpriteHeight - posY));
            }

            if (!Directory.Exists("Photos"))
            {
                Directory.CreateDirectory("Photos");
            }
            int count = Directory.GetFiles("Photos", "*").Length;
            bmp.Save("Photos\Img" + count + 1 + ".png", System.Drawing.Imaging.ImageFormat.Png);

            return bmp;
        }
        public Position(int poxX, int poxY)
        {
            PosX = poxX;
            PosY = poxY;
            if (Agent != null)
                ListPositions.Add(this);
        }
        public Position(int posX, int posY, Agent agent)
        {
            PosX = posX;
            PosY = posY;
            Agent = agent;
            if (Agent != null)
                ListPositions.Add(this);
        }
        public void AssociateAgent(Agent agent)
        {
            Agent = agent;
            if (Agent != null)
                ListPositions.Add(this);
        }
        public static bool CheckPositionIsValid(int poxX, int poxY)
        {
            int? NullableMaxX = MaxX;
            int? NullableMaxY = MaxY;
            var posXValid = poxX > 0 && (poxX <= MaxX || NullableMaxX == null); //verifies if posX is within the boundries of the premises
            var posYValid = poxY > 0 && (poxY <= MaxY || NullableMaxY == null); //verifies if posY is within the boundries of the premises
            return posXValid && posYValid; //returns if they are both valid
        }
        public static Position Find(int poxX, int poxY)
        {
            return ListPositions.Find(f => f.PosX == poxX && f.PosY == poxY) ?? null;
        }
        public static Position CreatePosition(int poxX, int poxY)
        {
            if (Find(poxX, poxY) == null)
                if (CheckPositionIsValid(poxX, poxY))
                    return new Position(poxX, poxY);
                else
                    return null;
            else
                return null;
        }
        public Dictionary<int, Position> ListNeighbourPositions(int dim = 1)
        {
            Dictionary<int, Position> NeighbourList = new Dictionary<int, Position>();
            for (int i = 1; i < 9; i++)
            {
                if (i != 5)
                {
                    var position = FindNeighbour(i, dim);
                    if (position != null)
                        NeighbourList.Add(i, position);
                }
            }
            return NeighbourList;
        }
        public Position FindNeighbour(int neighbourPos, int dim)
        {
            var position = FindNeighbourbyPosition(neighbourPos, dim);
            return Find(position.Item1, position.Item2);
        }
        public Tuple<int, int> FindNeighbourbyPosition(int neighbourPos, int dim = 1)
        {
            int neighbourPosX;
            int neighbourPosY;

            switch (neighbourPos)
            {
                case 1:
                    neighbourPosX = PosX - dim;
                    neighbourPosY = PosY - dim;
                    break;
                case 2:
                    neighbourPosX = PosX;
                    neighbourPosY = PosY - dim;
                    break;
                case 3:
                    neighbourPosX = PosX + dim;
                    neighbourPosY = PosY - dim;
                    break;
                case 4:
                    neighbourPosX = PosX - dim;
                    neighbourPosY = PosY;
                    break;
                case 6:
                    neighbourPosX = PosX + dim;
                    neighbourPosY = PosY;
                    break;
                case 7:
                    neighbourPosX = PosX - dim;
                    neighbourPosY = PosY + dim;
                    break;
                case 8:
                    neighbourPosX = PosX;
                    neighbourPosY = PosY + dim;
                    break;
                case 9:
                    neighbourPosX = PosX + dim;
                    neighbourPosY = PosY + dim;
                    break;
                default:
                    return null;
            }
            return new Tuple<int, int>(neighbourPosX, neighbourPosY);
        }
        public void UpdatePosition(int newX, int newY)
        {
            PosX = newX;
            PosY = newY;
        }
        public static void Serialize()
        {
            if (!Directory.Exists("Serialized"))
            {
                Directory.CreateDirectory("Serialized");
            }
            int count = Directory.GetFiles("Serialized", "*").Length;

            string fileName = "Serialized/PositionsSerialized_" + count + ".json";
            string jsonString = JsonConvert.SerializeObject(ListPositions, Formatting.Indented, new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });
            File.WriteAllText(fileName, jsonString);
        }

        public static void Deserialize()
        {
            if (Directory.Exists("Serialized"))
            {
                var FileName = "Serialized/PositionsSerialized_4.json";
                var JsonString = File.ReadAllText(FileName);                
                ListPositions = JsonConvert.DeserializeObject<List<Position>>(JsonString);
            }
            else
                MessageBox.Show("There's no directory");
        }
    }

您出现问题的原因是因为您将 setter 定义为私有...

    public static int MaxX { get; private set; }
    public static int MaxY { get; private set; }
    public int PosX { get; private set; }
    public int PosY { get; private set; }

应该是...

    public static int MaxX { get; set; }
    public static int MaxY { get; set; }
    public int PosX { get; set; }
    public int PosY { get; set; }