为什么 .NET 中没有 XML 可序列化字典?
我需要一个 XML 可序列化字典。 事实上,我现在有两个完全不同的程序需要一个。 我很惊讶地发现 .NET 没有这个。
有人可以启发我,考虑到各种 .NET 功能对 XML 序列化的依赖程度,为什么没有 XML 可序列化字典?
I need an XML-serializable dictionary. Actually, I now have two quite different programs that need one. I was rather surprised to see that .NET doesn't have one.
Can someone enlighten me, given how dependent various .NET features are on XML serialization, why there isn't an XML-serializable dictionary?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
我知道这个问题之前已经被回答过,但是由于我有一个非常简洁的方法(代码)来使用 DataContractSerializer 类(由 WCF 使用,但可以而且应该在任何地方使用)进行 IDictionary 序列化,我忍不住在这里贡献它
:在 .NET 4 中完美运行,也应该在 .NET 3.5 中运行,尽管我还没有测试它。
更新:它不能在.NET Compact Framework 中工作(甚至不能在 Windows Phone 7 的 NETCF 3.7 中工作),因为不支持
DataContractSerializer
!我进行了流式传输到字符串,因为它对我来说更方便,尽管我可以向 Stream 引入较低级别的序列化,然后使用它来序列化为字符串,但我倾向于仅在需要时进行概括(就像过早优化是邪恶的一样) ,所以这是不成熟的概括...)
用法非常简单:
myDictCopy 将是 myDict 的逐字副本。
您还会注意到,提供的泛型方法将能够序列化任何类型(据我所知),因为它不限于 IDictionary 接口,它实际上可以是任何泛型类型 T。
希望它对那里的人有帮助!
I know this has been answered before, but since I have a very concise way (code) for doing IDictionary serialization with the DataContractSerializer class (used by WCF, but could and should be used anywhere) I couldn't resist contributing it here:
This works perfectly in .NET 4 and should also work in .NET 3.5, although I didn't test it yet.
UPDATE: It doesn't work in .NET Compact Framework (not even NETCF 3.7 for Windows Phone 7) as the
DataContractSerializer
is not supported!I did the streaming to string because it was more convenient to me, although I could have introduced a lower-level serialization to Stream and then used it to serialize to strings, but I tend to generalize only when needed (just like premature optimization is evil, so it is premature generalization...)
Usage is very simple:
myDictCopy will be a verbatim copy of myDict.
You'll also notice that the generic methods provided will be able to serialize any type (to the best of my knowledge) since it is not limited to IDictionary interfaces, it can be really any generic type T.
Hope it helps someone out there!
XML 序列化的特点是它不仅仅是创建字节流。 它还涉及创建一个 XML 模式,该字节流将根据该模式进行验证。 XML Schema 中没有好的方法来表示字典。 您能做的最好的事情就是表明有一个唯一的密钥。
您始终可以创建自己的包装器,例如一种方式序列化字典。
The thing about XML Serialization is that it's not just about creating a stream of bytes. It's also about creating an XML Schema that this stream of bytes would validate against. There's no good way in XML Schema to represent a dictionary. The best you could do is to show that there's a unique key.
You can always create your own wrapper, for instance One Way to Serialize Dictionaries.
他们在 .NET 3.0 中添加了一个。 如果可以,请添加对 System.Runtime.Serialization 的引用并查找 System.Xml.XmlDictionary、System.Xml.XmlDictionaryReader 和 System.Xml.XmlDictionaryWriter。
我同意它不是在一个特别容易被发现的地方。
They added one in .NET 3.0. If you can, add a reference to System.Runtime.Serialization and look for System.Xml.XmlDictionary, System.Xml.XmlDictionaryReader, and System.Xml.XmlDictionaryWriter.
I would agree that it is not in a particularly discoverable place.
使用 DataContractSerializer! 请参阅下面的示例。
上面的代码生成以下 xml:
Use the DataContractSerializer! See the sample below.
The above code produces the following xml:
创建您自己的一个:-),只读功能是额外的好处,但如果您需要字符串以外的键,那么该类需要进行一些修改...
Create one of your own :-), the readonly feature is bonus but if you need a key other than a string then the class needs some modifications...
一个通用帮助器,可以在不使用继承的情况下快速将 IXmlSerialized 添加到任何(现有)字典:
以及一个方便的可序列化通用字典:
A generic helper to quickly add IXmlSerializable to any (existing) Dictionary without using inheritance:
And a convenient serializable generic dictionary:
这是我的实现。
This is my implementation.
我知道现在这已经被搞死了,但这是我的贡献。 我从@Loudenvier 和@Jack 的解决方案中汲取了精华,并编写了自己的可序列化(抱歉,我是英国人)字典类。
我喜欢这种方法,因为您不必显式序列化或反序列化任何内容,只需通过 XmlSerializer 泵送整个类层次结构即可。
I know this has been done to death now, but here is my contribution. I took the good bits from the solutions from @Loudenvier and @Jack and wrote my own serialisable (sorry, I'm British) dictionary class.
I like this approach because you won't have to explicitly serialise or deserialise anything, just pump the whole class hierarchy through an XmlSerializer and you're done.