C#: XML 反序列化限制

C#: XML Deserialize limitation

我有点像 XML serial/deserialize 的新手,很想写一些通用的 classes。 在使用 XmlSerializer.Deserialize(typeof(T)) 时,我意识到 T 对象应该与 XML 中的父元素同名。这是我用于此示例的 XML 文档,即 FoodPlaces.xml:

<foodplaces>
            <foodplace>
                <name> The Indian Restaurant</name>
                <week> 47 </week>
                <monday>
                    <food> Pasta </food>
                    <food> chineese food</food>
                    <food> veg food </food>
                </monday>
                <tuesday>
                    <food> Indian food</food>
                    <food> Veg food </food>
                </tuesday>
            </foodplace>
            <foodplace>
                <name> Restauran Italian </name>
                <week> 47 </week>
                <monday>
                    <food> Pizza </food>
                    <food> Checken      </food>
                    <food>  sallad </food>
                </monday>
                <tuesday>
                    <food> Fish </food>
                    <food>  ris </food>
                    <food> Biff </food>
                    <food> Checken </food>
                </tuesday>
            </foodplace>
        </foodplaces>

我就是这样反序列化这个 xml:

var serializer = new XmlSerializer(typeof(foodplaces));
var fs = new FileStream(@"D:\FoodPlaces.xml", FileMode.Open);
var reader = XmlReader.Create(fs);

var fp = (foodplaces)serializer.Deserialize(reader); 
fs.Close();

这绝对可以正常工作,因为我的存储 class 名称是 "foodplaces",它是 XML 文件中的 topmost/parent 元素。

当我尝试将我的存储 class 重命名为 MyFoodPlaces 时,发生了以下情况:

*System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=There is an error in XML document (1, 2).
  Source=System.Xml
//Skipping stack trace:
InnerException: 
       HResult=-2146233079
       **Message=<foodplaces xmlns=''> was not expected.**
       Source=Microsoft.GeneratedCode*

如果我将其重命名回 "foodplaces",即 XML.

中的 topmost/parent 元素,这将得到更正

问题:
1. 如果我想将此 XML 数据存储在其他 class 中,名称不同,例如 MyfoodPlaces,该怎么办?
2、使用LinQ有什么解决办法吗?

[XmlRoot("foodplaces")]
public class ThisCanBeAnything {...}

有一系列属性会对此产生影响,包括 [XmlRoot(...)][XmlElement(...)][XmlAttribute(...)][XmlArrayItem(...)][XmlArray(...)][XmlInclude(...)][XmlIgnore(...)] 等。它们还允许完全控制 xml 命名空间(而不仅仅是默认命名空间)。

有关详细信息,请参阅:https://msdn.microsoft.com/en-us/library/83y7df3e(v=vs.110).aspx and https://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx

请注意 [Serializable] 不会 影响 xml 序列化;当你使用 XmlSerializer.

时,不要相信任何人告诉你要包含它的人