我正在尝试将XML反序列化为对象,但我陷入了困境。有人可以帮帮我吗。
XML:
<?xml version="1.0" ?>
<Level>
<Warp_Blocks>
<Warp_Block>
<Block row="7" col="7" />
<Block row="2" col="7" />
</Warp_Block>
<Warp_Block>
<Block row="4" col="4" />
<Block row="3" col="7" />
</Warp_Block>
</Warp_Blocks>
</Level>
代码:
[XmlRoot("Level")]
public class LData
{
[XmlArray("Warp_Blocks")]
[XmlArrayItem("Warp_Block",typeof(WarpBlock),IsNullable = false)]
public List<WarpBlock> WarpBlocks;
}
public class LBlock
{
[XmlAttribute("row")]
public int row;
[XmlAttribute("col")]
public int col;
}
public class WarpBlock
{
[XmlArray("Warp_Block")]
[XmlArrayItem("Block",typeof(LBlock),IsNullable= false)]
public List<LBlock> WarpBlocks;
public WarpBlock()
{
WarpBlocks = new List<LBlock>();
}
}
我可以反序列化到一个级别,即我得到一个Item对象列表,但是单个Item对象不包含Block对象列表。我在这做错了什么?
答案 0 :(得分:3)
将您的LData类更改为:
[XmlRoot("Level")]
public class LData
{
[XmlElement("Warp_Blocks")]
public List<WarpBlock> WarpBlocks;
}
修改强>
我不知道为什么它没有读你的第二个Warp_Block。我认为唯一可能的原因是你做的不是你在问题中发布的内容。以下是完整的示例:
[XmlRoot("Level")]
public class LData
{
[XmlElement("Warp_Blocks")]
public List<WarpBlock> WarpBlocks;
}
public class LBlock
{
[XmlAttribute("row")]
public int row;
[XmlAttribute("col")]
public int col;
}
public class WarpBlock
{
[XmlArray("Warp_Block")]
[XmlArrayItem("Block", typeof(LBlock), IsNullable = false)]
public List<LBlock> WarpBlocks;
public WarpBlock()
{
WarpBlocks = new List<LBlock>();
}
}
public class Program
{
public static void Main()
{
string test =
"<?xml version=\"1.0\" ?>" +
"<Level>" +
" <Warp_Blocks>" +
" <Warp_Block>" +
" <Block row=\"7\" col=\"7\" />" +
" <Block row=\"2\" col=\"7\" />" +
" </Warp_Block>" +
" <Warp_Block>" +
" <Block row=\"4\" col=\"4\" />" +
" <Block row=\"3\" col=\"7\" />" +
" </Warp_Block>" +
" </Warp_Blocks>" +
"</Level>";
byte[] byteArray = Encoding.ASCII.GetBytes(test);
MemoryStream stream = new MemoryStream(byteArray);
XmlSerializer s = new XmlSerializer(typeof (LData));
LData data = (LData) s.Deserialize(stream);
foreach (var a in data.WarpBlocks)
foreach (var b in a.WarpBlocks)
Console.WriteLine(b.row + ", " + b.col);
Console.ReadKey();
}
}
它正确地输出了这个:
7, 7
2, 7
4, 4
3, 7
答案 1 :(得分:0)
我不知道你到底在做什么,但是有一个反序列化的问题(至少是二进制反序列化。我不知道,但我怀疑XML序列化是一样的)。在反序列化List<T>
或Dictionary<S,T>
时,列表将填充null
值(如果值为默认值,则为默认值),直到退出反序列化构造函数为止。只有在退出构造函数后,列表才会填充实际的反序列化T
s。
这意味着如果要对列表执行某些操作,则无法在构造函数中完成。您可以改为创建一个方法,其中包含需要对列表执行的任何工作,并且只要使用[OnDeserializedAttribute]
属性进行注释,就会在列表之后将其称为已经填充但之前反序列化返回。该方法可以具有任何名称。
有关详细信息,请参阅MSDN。