GVKun编程网logo

为什么XmlSerializer不支持Dictionary?(xml不支持load属性)

28

本文将分享为什么XmlSerializer不支持Dictionary?的详细内容,并且还将对xml不支持load属性进行详尽解释,此外,我们还将为大家带来关于.net–NonSerialized和Xm

本文将分享为什么XmlSerializer不支持Dictionary?的详细内容,并且还将对xml不支持load属性进行详尽解释,此外,我们还将为大家带来关于.net – NonSerialized和Xml.Serialization.XmlIgnore之间的区别?、.net – 为什么XmlSerializer没有序列化我的数组?、at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)、c# .net core System.Xml.Serialization 需使用包 System.Xml.XmlSerializer补齐属性的相关知识,希望对你有所帮助。

本文目录一览:

为什么XmlSerializer不支持Dictionary?(xml不支持load属性)

为什么XmlSerializer不支持Dictionary?(xml不支持load属性)

只是好奇为什么不支持Dictionary XmlSerializer

通过使用DataContractSerializer对象并将其写入,您可以很容易地解决它XmlTextWriter,但是Dictionary的特征是什么使得XmlSerializer考虑到它实际上是KeyValuePairs数组很难处理。

实际上,您可以将传递IDictionary<TKey, TItem>给需要的方法IEnumerable<KeyValuePairs<TKey,ITem>>

答案1

小编典典

哈希表通常需要哈希码和相等比较器提供程序。这些不能以XML轻松序列化,并且绝对不会移植。

但是我认为您已经找到了答案。只需将哈希表序列化为a List<KeyValuePair<K,V>>,然后将其(重新)构造为哈希表即可。

.net – NonSerialized和Xml.Serialization.XmlIgnore之间的区别?

.net – NonSerialized和Xml.Serialization.XmlIgnore之间的区别?

我们正在从 XML序列化/反序列化一个类,但是我们要排除的类中有属性和字段.

System.NonSerialized和System.Xml.Serialization.XmlIgnore属性似乎做了这个工作,但它们有什么区别?看来我们可以在类的任何一个属性或者字段上使用XmlIgnore.但是NonSerialized只能在字段上使用.在任何情况下是否有任何理由不使用XmlIgnore,如果是这样,NonSerialized属性的目的是什么?为什么使用不同?

这是允许的:

<System.NonSerialized()> _
Public Foo As String

这是允许的:

<System.Xml.Serialization.XmlIgnore()> _
Public Foo As String

这是允许的:

<System.Xml.Serialization.XmlIgnore()> _
Public Property Bar() As String
    Get
        Return _Bar
    End Get
    Set(ByVal value As String)
        _Bar = value
    End Set
End Property

但这是不允许的:

<System.NonSerialized()> _
Public Property Bar() As String
    Get
        Return _Bar
    End Get
    Set(ByVal value As String)
        _Bar = value
    End Set
End Property
NonSerialized适用于比XML更多类型的序列化.如果您将序列化为二进制或SOAP,则使用NonSerialized,如果使用XmlSerializer严格序列化为XML,则使用XmlIgnore.请参阅MSDN上 NonSerializedAttribute课程的备注部分.

.net – 为什么XmlSerializer没有序列化我的数组?

.net – 为什么XmlSerializer没有序列化我的数组?

我是XmlSerializer的新手.我写了一个小类来保存数据库中的条目:

[Serializable]
public struct Entry
{
    public string artkey,lid,request,status,requestdate;
}

很简单吧?序列化这些列表应该是小菜一碟.

我有一个编译这些列表的函数.要序列化我的列表,我尝试以下代码:

XmlSerializer serializer = new XmlSerializer(typeof(Entry));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
serializer.Serialize(ms,entries.ToArray());
ms.Writeto(Response.OutputStream);

此代码打印以下异常:

<error>system.invalidOperationException: There was an error generating the XML document. ---> system.invalidCastException: Specified cast is not valid.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterEntry.Write3_Entry(Object o)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,Object o,XmlSerializerNamespaces namespaces,String encodingStyle,String id)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream,XmlSerializerNamespaces namespaces)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream,Object o)
   at CCB_Requests.xmlResponse_selectFromCcb_Requests(HttpResponse response)
   at CCB_Requests.ProcessRequest(HttpContext context)</error>

看来我一定是犯了一个简单的错误.我怎样才能解决这个问题?

解决方法

您正在序列化一个Entry数组,将XmlSerializer的初始化更改为:

// typeof(Entry) ==> typeof(Entry[])
XmlSerializer serializer = new XmlSerializer(typeof(Entry[]));

at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)

at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)

运行hadoop 统计学生成绩的例子 就报了这个错,都不做的错在哪里 ,郁闷了 ,想跟踪都不怎么下手,求大神指点江山。console 报的错:

13/09/12 00:15:20 INFO mapred.JobClient:  map 0% reduce 0%
13/09/12 00:15:31 INFO mapred.JobClient: Task Id : attempt_201309112309_0010_m_000000_0, Status : FAILED
java.lang.NullPointerException
    at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:970)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)

看这个就知道是一个空指针,其他的啥子信息都没用,然后看logs日志 :

13/09/12 00:15:20 INFO mapred.JobClient:  map 0% reduce 0%
13/09/12 00:15:31 INFO mapred.JobClient: Task Id : attempt_201309112309_0010_m_000000_0, Status : FAILED
java.lang.NullPointerException
    at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:970)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)

只能看到是那个任务上有错 ,但不知道why?求哥些指点指点,谢谢了


c# .net core System.Xml.Serialization 需使用包 System.Xml.XmlSerializer补齐属性

c# .net core System.Xml.Serialization 需使用包 System.Xml.XmlSerializer补齐属性

.net core 也是够奇葩的,去掉了原先许多using System.Xml.Serialization中的接口又以打包的方式提供真没话讲了。 代码:

// [XmlRoot("DeleteResult")]和[XmlElement("Deleted")],.net core中引用`System.Xml.Serialization`是没有提供的这种方法的,你需要安装依赖包System.Xml.XmlSerializer就可以了。
    [XmlRoot("DeleteResult")]
    public class DeleteObjectsResult : GenericResult
    {
        private DeletedObject[] _keys;

        [XmlElement("Deleted")]
        public DeletedObject[] Keys 
        {
            get
            {
                if (EncodingType == null)
                    return _keys;

                bool isUrlEncoding = EncodingType.ToLowerInvariant().Equals(HttpUtils.UrlEncodingType);
                foreach (var key in _keys)
                {
                    key.Key = isUrlEncoding ? HttpUtils.DecodeUri(key.Key) : key.Key;
                }
                return _keys;
            }
            set
            {
                this._keys = value;
            }
        }

今天关于为什么XmlSerializer不支持Dictionary?xml不支持load属性的介绍到此结束,谢谢您的阅读,有关.net – NonSerialized和Xml.Serialization.XmlIgnore之间的区别?、.net – 为什么XmlSerializer没有序列化我的数组?、at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)、c# .net core System.Xml.Serialization 需使用包 System.Xml.XmlSerializer补齐属性等更多相关知识的信息可以在本站进行查询。

本文标签: