C# 如何将xml反序列化为对象 名称1 描述1 姓名2 描述2

C# 如何将xml反序列化为对象 名称1 描述1 姓名2 描述2,c#,xml-deserialization,C#,Xml Deserialization,我有这个XML, 我应该如何建模该类,以便能够使用XmlSerializer对象对其进行反序列化?您的类应该是这样的 <StepList> <Step> <Name>Name1</Name> <Desc>Desc1</Desc> </Step> <Step> <Name>Name2</Name> <Desc>Desc2&l

我有这个XML,
我应该如何建模该类,以便能够使用
XmlSerializer
对象对其进行反序列化?

您的类应该是这样的

<StepList>
  <Step>
    <Name>Name1</Name>
    <Desc>Desc1</Desc>
  </Step>
  <Step>
    <Name>Name2</Name>
    <Desc>Desc2</Desc>
  </Step>
</StepList>
[XmlRoot(“步骤列表”)]
公共类步骤列表
{
[XmlElement(“步骤”)]
公共列表步骤{get;set;}
}
公共类步骤
{
[XmlElement(“名称”)]
公共字符串名称{get;set;}
[XmlElement(“Desc”)]
公共字符串Desc{get;set;}
}
这是我的测试代码

[XmlRoot("StepList")]
public class StepList
{
    [XmlElement("Step")]
    public List<Step> Steps { get; set; }
}

public class Step
{
    [XmlElement("Name")]
    public string Name { get; set; }
    [XmlElement("Desc")]
    public string Desc { get; set; }
}
string testData=@”
名称1
描述1
姓名2
描述2
";
XmlSerializer serializer=新的XmlSerializer(typeof(StepList));
使用(TextReader=new StringReader(testData))
{
步骤列表结果=(步骤列表)序列化程序。反序列化(读取器);
}
如果要读取文本文件,应将该文件加载到文件流中 并将其反序列化

string testData = @"<StepList>
                        <Step>
                            <Name>Name1</Name>
                            <Desc>Desc1</Desc>
                        </Step>
                        <Step>
                            <Name>Name2</Name>
                            <Desc>Desc2</Desc>
                        </Step>
                    </StepList>";

XmlSerializer serializer = new XmlSerializer(typeof(StepList));
using (TextReader reader = new StringReader(testData))
{
    StepList result = (StepList) serializer.Deserialize(reader);
}
使用(FileStream FileStream=new FileStream(“,FileMode.Open))
{
步骤列表结果=(步骤列表)序列化程序。反序列化(文件流);
}

以上评论是正确的。你错过了装饰师。 如果你想要一个通用的反序列化程序,你可以使用它

using (FileStream fileStream = new FileStream("<PathToYourFile>", FileMode.Open)) 
{
    StepList result = (StepList) serializer.Deserialize(fileStream);
}
public static T反序列化XmlFileToObject(字符串XmlFilename)
{
T returnObject=默认值(T);
if(string.IsNullOrEmpty(XmlFilename))返回默认值(T);
尝试
{
StreamReader xmlStream=新的StreamReader(XmlFilename);
XmlSerializer serializer=新的XmlSerializer(typeof(T));
returnObject=(T)序列化程序。反序列化(xmlStream);
}
捕获(例外情况除外)
{
ExceptionLogger.WriteExceptionToConsole(例如DateTime.Now);
}
返回对象;
}
那么你可以这样称呼它:

public static T DeserializeXMLFileToObject<T>(string XmlFilename)
{
    T returnObject = default(T);
    if (string.IsNullOrEmpty(XmlFilename)) return default(T);

    try
    {
        StreamReader xmlStream = new StreamReader(XmlFilename);
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        returnObject = (T)serializer.Deserialize(xmlStream);
    }
    catch (Exception ex)
    {
        ExceptionLogger.WriteExceptionToConsole(ex, DateTime.Now);
    }
    return returnObject;
}
MyObjType MyObj=反序列化XMLFileToObject(文件路径);

[XmlElement(“步骤”)]是删除XML中嵌套的“步骤”的关键(…),我不理解。当然
[xmlement(“步骤”)]
是关键,是正确的。您对“-的意思是删除XML中的“步骤”嵌套(…)”。非常感谢。这不是为了你,而是为了其他可能正在阅读答案的人:)如果你没有[XmlElement],那么生成的XML将是这样的:Name1Name2。我花了一段时间才弄明白如何删除外部块。我在课堂上没有[XmlElement(“Step”)]的情况下尝试过,结果是working@suchoss是的,使用“使用”有很多好处。
MyObjType MyObj = DeserializeXMLFileToObject<MyObjType>(FilePath);