Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编码方面用XML序列化特定C#类的最简单方法_C#_Xml_Serialization - Fatal编程技术网

在编码方面用XML序列化特定C#类的最简单方法

在编码方面用XML序列化特定C#类的最简单方法,c#,xml,serialization,C#,Xml,Serialization,我试图将类的一部分从C#模型序列化为XML文件。然而,我想用更少的代码量来完成它 我目前有: 一个具有许多属性(其中一些属性用[XmlIgnore]注释)的类来序列化 public class MyClass { public int id {get;set;} public string Title {get;set;} public string Body {get;set;} [XmlIgnore] public byte[] Image {get

我试图将类的一部分从C#模型序列化为XML文件。然而,我想用更少的代码量来完成它

我目前有: 一个具有许多属性(其中一些属性用[XmlIgnore]注释)的类来序列化

public class MyClass
{
    public int id {get;set;}
    public string Title {get;set;}
    public string Body {get;set;}

    [XmlIgnore]
    public byte[] Image {get;set;}
    ...
}
我需要匹配的模式

<Properties>
<Property Name="id">Value</Property>
<Property Name="Title">Value</Property>
<Property Name="Body">Value</Property>
...
</Properties>

价值
价值
价值
...
该名称是我的c#模型中的属性


到目前为止,我发现的唯一的东西需要我为它创建一个不同的类,我不想将我的模型拆分为不同的子类。您知道为此创建自定义序列化的方法(可能使用注释)吗?

最简单的方法是实现。有一个很好的关于如何在代码项目上执行此操作的教程:,但大多数代码都必须自己处理。如果可能的话,我建议您使用标准序列化,这样做要容易得多。

我通常使用
XmlSerializer
()

反序列化:

var ser = new XmlSerializer(typeof(MyType));

using (var fs = new FileStream("Resources/MyObjects.xml", FileMode.Open))
{
    var obj = ser.Deserialize(fs);
    var myObject = obj as myType;
    if(myObject != null)
        // do action
}
序列化:

 var ser = new XmlSerializer(typeof(MyType));
 using (var fs = new FileStream("Resources/MyObjects.xml", FileMode.Create))
 {
     ser.Serialize(fs, myObject)
 }

尝试以下操作:将属性反射到
XElement

public static XElement ToXml<T>(T obj)
{
     return new XElement("Properties",
                         from pi in  typeof (T).GetProperties()
                         where !pi.GetIndexParameters().Any() 
                                && !pi.GetCustomAttributes(typeof(XmlIgnoreAttribute), false).Any()
                         select new XElement("Property"
                                             , new XAttribute("Name", pi.Name)
                                             , pi.GetValue(obj, null))
        );
}
publicstaticxelement-ToXml(T-obj)
{
返回新的XElement(“属性”,
来自typeof(T.GetProperties()中的pi
其中!pi.GetIndexParameters().Any()
&&!pi.GetCustomAttributes(typeof(XmlIgnoreAttribute),false).Any()
选择新XElement(“属性”
,新的XAttribute(“名称”,pi.Name)
,pi.GetValue(对象,null))
);
}

重复。您不使用的原因是什么?这似乎是一个完美的选择……我建议更改问题的标题:您正在寻找在编码时间方面“高效”的东西,而不是在运行时或可维护性方面“高效”的东西。因此,这个问题也不是@CodeCaster建议的明确要求运行时效率的另一个问题的重复。@CodeCaster:不是你提到的问题的重复,因为OP希望有简单的代码,也不一定是最快、最紧凑的解决方案。@CodeCaster:这个问题明确要求Xml解决方案非常灵活,需要尽可能少的编码,而另一个问题要求运行时和内存效率达到最佳,评分最高的答案指向非Xml序列化方法。我正是这么做的。但是格式不是我需要的。我有一个公共类MyClass{public int id{get;set;}公共字符串标题{get;set;}公共字符串主体{get;set;}因此,输出与我的输出不同need@Revv请更新您的问题,以显示您要序列化的类和所需的输出。采用这种方式有什么特殊原因吗?数据库中的xml必须相同,以使API在新数据中比在旧数据中工作得更好。Linq to xml真的很有用,我在dese上也使用过它谢谢