将模型导出到没有列名或标题(仅值)的文本文件

时间:2019-04-02 07:24:30

标签: c# serialization export-to-text

我有一个DTO(数据传输对象)对象作为模型,其中包含接收到的来自Response的数据。我只需要将标题/列下的值导出到文本文件。列名或标题无需导出。我可以借助XmlSerializer以XML格式导出数据。但是找不到任何文本序列化程序。 我的模型如下:

public class ResponseGradeDto
    {
        [XmlIgnore]
        [XmlElement(ElementName = "GRADEID")]
        public Guid Id { get; set; }
        [XmlElement(ElementName = "GRADENAME")]
        public string Name { get; set; }
        [XmlElement(ElementName = "GRADECODE")]
        public string Code { get; set; }
        public List<GradeQualitySpecDto> QualitySpecItem { get; set; }

}

我尝试了以下代码:

System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(responseGradeDto.GetType());

            using (StringWriter textWriter = new StringWriter())
            {
                xmlSerializer.Serialize(textWriter, responseGradeDto);
                string a = textWriter.ToString();
                return textWriter.ToString();
            }

假设我的模型如下:

{

        "name": "My Name",
        "code": "1234",
        "information": "My Info",
        "gradeQualitySpecItem": [
        {
            "propertyid": "100",
            "propertyname": "PropertyName1",
            "target": 10,
            "sigma": 20
        },
        {
            "propertyid": "200",
            "propertyname": "PropertyName2",
            "target": 10,
            "sigma": 30
        }]
}

我需要在文本文件中输出以下内容:

AL300 SAMPLE(Some hard coded text)
My Name
1234
My Info
PROP-SUMMARY
100
PropertyName1
10
20
PROP-SUMMARY
200
PropertyName2
10
30
end AL300 SAMPLE(end of file)

enter image description here

如果是列表,我将获得以下列表的输出。 有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

没有内置的“纯文本”序列化程序将对象属性值序列化为以行分隔的文本。在大多数情况下,当您要将对象保存为文本时,只需编写代码即可。

示例:

var x = new ResponseGradeDto{ 
        Id = Guid.NewGuid(), 
        Name = "Foo",
        Code = "Cde",
        Information = "No info"
};

using (var writer = new StreamWriter(@"C:\temp\log.txt"))
{
    writer.WriteLine(x.Name);
    writer.WriteLine(x.Code);
    writer.WriteLine(x.Information);
}

但是,更通用的方法是使用反射来获取对象的所有引用属性:

var properties = typeof(ResponseGradeDto).GetProperties();

然后将属性转储到文件中可能很简单(请注意,我使用了上面代码中定义的对象x):

File.WriteAllLines(@"C:\temp\attr.txt", properties.Select(p => p.GetValue(x).ToString()));

如果愿意,可以将属性与上述反射解决方案一起使用,以过滤掉所需的/不需要的属性。在这里,我重复使用您在示例中使用的“ Xml属性”,您可以编写自己的属性:

var properties = typeof(ResponseGradeDto).GetProperties().Where(
                    prop => Attribute.IsDefined(prop, typeof(XmlElementAttribute))
                        && !Attribute.IsDefined(prop, typeof(XmlIgnoreAttribute))
            );

希望这会有所帮助!