标签: xmlserializer

XmlSerializer等效于IExtensibleDataObject

使用DataContracts,您可以从IExtensibleDataObject派生,以允许往返工作,而不会丢失XML文件中的任何未知的其他数据.

我不能使用DataContract,因为我需要控制输出XML的格式.但我还需要能够在旧版本的应用程序中读取未来版本的XML文件,而不会丢失XML文件中的任何数据.

例如

XML v1:

<Person>
    <Name>Fred</Name>
</Person>
Run Code Online (Sandbox Code Playgroud)

XML v2:

<Person>
    <Name>Fred</Name>
    <Age>42</Age>
</Person>
Run Code Online (Sandbox Code Playgroud)

如果从我的应用程序的v1读取XML v2文件,则反序列化并将其再次序列化将其转换为XML v1文件.即"年龄"字段被删除.

是否有类似于IExtensibleDataObject的东西,我可以使用XmlSerializer来避免Age字段消失?

c# xml serialization xmlserializer iextensibledataobject

2
推荐指数
1
解决办法
832
查看次数

使用char - C#进行数据协定反序列化问题

我的代码参考

var sample = DataContractDeserializeObject<MySample>(
                        "<MySample xmlns=\"http://schemas.datacontract.org/2004/07/Sample\"><Charecter>'D'</Charecter></MySample>");

When i run this code. i get this message "There was an error deserializing the object of type MySample. Content cannot be converted to the type Int. Line 1, position 129."
Run Code Online (Sandbox Code Playgroud)

我的反序列化代码

 public static T DataContractDeserializeObject<T>(string objectToDeserialize)
        {
            using (XmlReader reader = XmlReader.Create(new StringReader(objectToDeserialize)))
            {
                var serializer =
                    new DataContractSerializer(typeof(T));
                return (T)serializer.ReadObject(reader);
            }
        }
Run Code Online (Sandbox Code Playgroud)

我的数据合同

[DataContract]
    public class MySample
    {
        [DataMember]
        public char Charecter { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

如何对char进行反序列化.谢谢.

c# serialization datacontractserializer xmlserializer

2
推荐指数
1
解决办法
425
查看次数

如何序列化自定义对象类型列表

我有这样的课

public class Record
{
    public Int32 TotalTrail { get; set; }
    public TimeSpan MyTimeSpan { get; set; }
    public DateTime MyDateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个List来保存它的对象:

List<Record> _records;
Run Code Online (Sandbox Code Playgroud)

然后,当我想序列化列表时:

serializer.Serialize(stream,_records);

上面的行有一个运行时错误:

无法将System.Collections.Generic.List`1 [[SimpleGame.Record,SimpleGame,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]类型的对象分配给SimpleGame.Record类型的对象.

是因为我无法序列化列表吗?我怎样才能解决这个问题?

c# serialization exception-handling list xmlserializer

2
推荐指数
1
解决办法
8761
查看次数

XmlSerializer 用问号“?”替换非 ASCII 字符

我有一个非常适合 ASCII 的 XML 序列化程序,但是当遇到非 ASCII 字符时,它们会被替换为问号“?”。我相信我已经为 UTF8 正确配置了它,但不确定为什么要这样做。

XmlSerializer xmls = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
    XmlWriterSettings settings = new XmlWriterSettings();
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    settings.Encoding = Encoding.UTF8;
    settings.Indent = true;
    settings.NewLineChars = "\n";
    settings.NewLineHandling = NewLineHandling.None;
    settings.NewLineOnAttributes = false;
    settings.ConformanceLevel = ConformanceLevel.Document;
    settings.OmitXmlDeclaration = true;

    using (XmlWriter writer = XmlTextWriter.Create(ms, settings))
    {
        xmls.Serialize(writer, obj, ns);
    }

    string xml = Encoding.UTF8.GetString(ms.ToArray());

    // remove the BOM character at the beginning which screws up …
Run Code Online (Sandbox Code Playgroud)

c# xml xmlserializer

2
推荐指数
1
解决办法
2506
查看次数

实体框架输出XML而不是JSON

在控制器类中,我有很多方法可以输出格式正确的JSON数据。它们全都执行数据库查询。例如

// GET api/User
public IEnumerable<Object> GetUsers()
{
    var query = from user in db.Users
                orderby user.Name
                select new { Name = user.Name};

    return query.AsEnumerable<Object>();
}
Run Code Online (Sandbox Code Playgroud)

现在,我想返回我的一个类的属性。

public IEnumerable<Object> GetProperties()
{
    return typeof(MyClass)
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Select(p => p.Name).ToList();
}
Run Code Online (Sandbox Code Playgroud)

但是,与其输出JSON实体框架,不如给我一些XML,例如

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <string>Property1</string>
    <string>Property2</string>
</ArrayOfstring>
Run Code Online (Sandbox Code Playgroud)

我试图在控制器方法中转换输出。

public string GetProperties()
{
    var results = typeof(ComplexInfo)
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Select(p => p.Name).ToList();
    return JsonConvert.SerializeObject(results, Formatting.Indented,
        new JsonSerializerSettings {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects
        });
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它仍在输出XML。

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">[
  "Property1",
  "Property2",
]</string>
Run Code Online (Sandbox Code Playgroud)

如何确保从控制器检索JSON对象?

asp.net-mvc json entity-framework xml-serialization xmlserializer

2
推荐指数
1
解决办法
1015
查看次数

反序列化具有未知元素顺序的 XML

我正在尝试为一项规格确实不足的服务实现一个客户端。它类似于 SOAP,尽管它没有 WSDL 或等效文件。该规范也没有提供有关元素正确排序的任何信息 - 它们在规范中按字母顺序列出,但如果它们在请求中的顺序不正确,则服务会返回 XML 解析错误(所述顺序由检查示例)。

我可以它来提交请求,即使这很痛苦。但是,我不知道如何正确处理响应。

使用两者SoapEnvelope和直接使用XmlSerializer,如果响应包含我尚未正确订购的元素,它会显示null在我的对象上。再次,我可以设法处理这个问题,并使用 attribute 手动排序类属性Order我无法判断原始 XML 是否有一个我没有正确排序并因此保留为 的字段null

这引出了当前的问题: 如何检查 XmlSerializer 是否删除了字段

c# serialization soap xml-serialization xmlserializer

2
推荐指数
1
解决办法
3574
查看次数

将冒号 (:) 放入 xml 属性中

我正在开发 android 项目,在任务的某些部分我需要创建 xml 文档文件。我需要像这样创建包含冒号的属性

<APPLICAD_EXPORT xsi:noNamespaceSchemaLocation="file:///c:/temp/applicad-export.xsd">
Run Code Online (Sandbox Code Playgroud)

我可以成功创建 xml 文件,但问题是我无法为属性 APPLICAD_EXPORT 添加冒号。

到目前为止,我确实喜欢这样获取属性前缀的冒号

XmlSerializer serializer = Xml.newSerializer();

            //we set the FileOutputStream as output for the serializer, using UTF-8 encoding
            serializer.setOutput(fileos, "UTF-8");
            //Write <?xml declaration with encoding (if encoding not null) and standalone flag (if standalone not null)
            serializer.startDocument(null, Boolean.valueOf(true));
            //set indentation option
            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);

            serializer.startTag(null, "APPLICAD_EXPORT");
            serializer.attribute(null, "xsi&#58;noNamespaceSchemaLocation", "file:///c:/temp/applicad-export.xsd");
Run Code Online (Sandbox Code Playgroud)

但它显示错误说属性 xsi 的规范强制值

我想可能有某种方法可以实现这一目标,但我无法弄清楚。

java xml android attributes xmlserializer

2
推荐指数
1
解决办法
5653
查看次数

在 C# Web api 中序列化 xml 时删除命名空间内部节点

我正在使用 webapi MVC 模板 使用默认的 XmlSerializer 我得到以下输出

OUTPUT:
<ClassName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Child1>String</Child>
<Child2 xsi:nil=true/>
</ClassName> 

DTO class
[XmlRoot("ClassName")]
[DataContract]
public class ClassName
{
        [DataMember]
        [XmlElement("Child1")]
        public string Child1{ get; set; }

        [DataMember]
        [XmlElement("Child2",IsNullable =true)]
        public string Child2{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我设法通过覆盖默认的 xmlformatter 来删除根节点命名空间

//Code to remove root node namespace
  using (XmlWriter xw = XmlWriter.Create(streamWriter, settings))
                    {
                        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                        ns.Add("", "");
                        serializer.Serialize(xw, value, ns);

                }
Run Code Online (Sandbox Code Playgroud)

但是现在根节点中的命名空间被删除,但子节点仍然具有命名空间

Current Output:
<ClassName>
    <Child1>String</Child>
    <Child2 xsi:nil=true p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"/>
</ClassName>
Expected output: …
Run Code Online (Sandbox Code Playgroud)

c# xml xmlserializer

2
推荐指数
1
解决办法
2186
查看次数

C#XmlSerializer使用xs:string以外的类型忽略xs:attribute

我的问题似乎很奇怪,我没有发现任何其他问题,所以我想这是一个非常简单和愚蠢的错误,我似乎无法找到.

我有一个XSD,我使用xsd.exe生成一个类结构.我用值"填充"我的对象,但在将其序列化为XML时,它会忽略所有不属于类型的类属性string.

var myGraph = new graph();
myGraph.myString = "hallo";
myGraph.myInt = 80;

var serializer = new XmlSerializer(typeof(graph));
TextWriter writeFileStream = new StreamWriter(Path.Combine(outFolder, outFile));
serializer.Serialize(writeFileStream, myGraph);
writeFileStream.Close();
Run Code Online (Sandbox Code Playgroud)

我期望:

<graph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
    myString="hallo" 
    myInt="80"
/>
Run Code Online (Sandbox Code Playgroud)

实际输出是:

<graph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    myString="hallo" 
/>
Run Code Online (Sandbox Code Playgroud)

该属性myInt已被忽略.如果我将其定义为字符串,它也会出现,但与其他任何类型一样,它都不会出现.如果我声明required并离开它null,它将被序列化为myInt="0".

我错过了什么?

一些细节:

XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="graph">
    <xs:complexType>
      <xs:attribute name="myString" type="xs:string" />
      <xs:attribute name="myInt" type="xs:int" />
    </xs:complexType>
  </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

生成的类:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=false)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public …
Run Code Online (Sandbox Code Playgroud)

c# attributes xmlserializer

1
推荐指数
1
解决办法
2192
查看次数

继承XmlSerializer C#

我有这三个班:

Class Image : Asset
Class Sound : Asset
Class Video : Asset
Run Code Online (Sandbox Code Playgroud)

一切都序列化好,但当我创建这个项目时:

Class Master
List<Asset> assets //property
Run Code Online (Sandbox Code Playgroud)

例如,这个类的一个实例:

Image i = new Image();
Sound s = new Sound();
Video v = new Video();
Master m =  new Master( new List<Asset>{i,s,v} )
Run Code Online (Sandbox Code Playgroud)

它没有序列化异常"InvalidOperationException - 生成XML文档时出错",并且在innerException中:{"不期望MyApplication.Video类型.使用XmlInclude或SoapInclude属性指定静态未知的类型." }

.. 任何的想法??

c# inheritance xmlserializer

1
推荐指数
1
解决办法
2215
查看次数