Microsoft 实现了他们自己的紧凑二进制 XML 编码 (MC-NBFX),这是 WCF 中的一个选项,用于比标准 XML 文本编码更有效地传送 XML 信息集(例如 SOAP 请求和响应)。
我想使用相同的编码,例如以紧凑的二进制形式将大型 XML 文件保存到磁盘。
我开始于:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(@"<Foo><Bar>abc</Bar></Foo>");
using(FileStream fs = new FileStream("c:/tmp/foo.bin", FileMode.Create))
{
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs))
{
xmlDoc.WriteTo(xbw);
}
}
Run Code Online (Sandbox Code Playgroud)
这确实输出了一个 MC-NBFX 格式的文件,但是如果我用重复的字符串(例如元素名称)对 XML 文档进行编码,这些名称会在二进制文件中多次出现。
XmlDictionaryWriter 的要点在于它允许定义字符串字典并用字符串 ID 替换流中的字符串。实际上有两个字典,一个可以传递给 CreateBinaryWriter() 并且旨在成为预定/静态字典。我尝试插入这样一个静态字典,但编码器忽略了它:
XmlDictionary xmlDictionary = new XmlDictionary();
xmlDictionary.Add("Foo");
xmlDictionary.Add("Bar");
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs, xmlDictionary))
{
xmlDoc.WriteTo(xbw);
}
Run Code Online (Sandbox Code Playgroud)
第二种类型的字典是动态的,据说在编写过程中添加了字符串。要使用此机制,需要使用(并且可能覆盖)XmlBinaryWriterSession。例如:
XmlBinaryWriterSession writerSession = new XmlBinaryWriterSession();
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs, null, writerSession))
{
xmlDoc.WriteTo(xbw);
}
Run Code Online (Sandbox Code Playgroud)
同样,这对输出没有影响,仍然会出现重复的字符串,并且在写入完成后 …
我想以紧凑格式将 xml 文档写入磁盘。为此,我使用.net框架的方法XmlDictionaryWriter.CreateBinaryWriter(Stream stream,IXmlDictionary dictionary)
此方法编写一个自定义的紧凑二进制 xml 表示形式,稍后可以由XmlDictionaryWriter.CreateBinaryReader
. 该方法接受XmlDictionary
可以包含常见字符串的 ,因此不必每次都在输出中打印这些字符串。文件中将打印字典索引而不是字符串。CreateBinaryReader
稍后可以使用相同的字典来反转该过程。
然而我传递的字典显然没有被使用。考虑这段代码:
\n\nusing System.IO;\nusing System.Xml;\nusing System.Xml.Linq;\n\nclass Program\n{\n public static void Main()\n {\n XmlDictionary dict = new XmlDictionary();\n dict.Add("myLongRoot");\n dict.Add("myLongAttribute");\n dict.Add("myLongValue");\n dict.Add("myLongChild");\n dict.Add("myLongText");\n\n XDocument xdoc = new XDocument();\n xdoc.Add(new XElement("myLongRoot",\n new XAttribute("myLongAttribute", "myLongValue"),\n new XElement("myLongChild", "myLongText"),\n new XElement("myLongChild", "myLongText"),\n new XElement("myLongChild", "myLongText")\n ));\n\n using (Stream stream = File.Create("binaryXml.txt"))\n using (var writer = XmlDictionaryWriter.CreateBinaryWriter(stream, dict))\n {\n xdoc.WriteTo(writer);\n }\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n产生的输出是这样的(二进制控制字符未显示)
\n\n@\nmyLongRootmyLongAttribute\xcb\x9cmyLongValue@myLongChild\xe2\x84\xa2\nmyLongText@myLongChild\xe2\x84\xa2\nmyLongText@myLongChild\xe2\x84\xa2\nmyLongText\n …
Run Code Online (Sandbox Code Playgroud) I have an app which has fragment
and image button
on that. The problem is it's working on and above 5.0
but not below 5.0. The min sdk version is 17.
Not getting what's wrong here. I am getting 2 exceptions.
One is RuntimeException
for image button
.
Second is ResourceNotFoundException
for fab selector file.
Log : 1st exception --
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.siddhi.timetablelayout/com.example.siddhi.timetablelayout.MainActivity}: android.view.InflateException: Binary XML file line #16:
Error inflating class ImageButton
2nd exception --
Caused …
android android-resources inflate-exception binary-xml android-imagebutton