将.NET数组序列化为XML作为基64?
我正在用C#编写一个自定义的.NET序列化程序,并希望使用XmlReader和XmlWriter将数组对象读写到XML。我想对数组进行base64编码。数组可以是1维、2维或3维,元素为布尔类型或数字类型 我完全被难住了。XmlReader和XmlWriter都有将Byte[]数组读写为base64的方法,但我不知道如何从数组到Byte[]再返回 数组可能很大,因此我更喜欢一种不涉及复制数组或一次处理一个元素的解决方案。不安全代码和托管的或本地C++都很好。如果对XML安全,我可以使用base64以外的东西将.NET数组序列化为XML作为基64?,.net,arrays,serialization,base64,.net,Arrays,Serialization,Base64,我正在用C#编写一个自定义的.NET序列化程序,并希望使用XmlReader和XmlWriter将数组对象读写到XML。我想对数组进行base64编码。数组可以是1维、2维或3维,元素为布尔类型或数字类型 我完全被难住了。XmlReader和XmlWriter都有将Byte[]数组读写为base64的方法,但我不知道如何从数组到Byte[]再返回 数组可能很大,因此我更喜欢一种不涉及复制数组或一次处理一个元素的解决方案。不安全代码和托管的或本地C++都很好。如果对XML安全,我可以使用base6
感谢您的帮助或提示。根据您使用的“数组”类型,您将有不同的选项。它是数组、列表还是ArrayList 对于列表,您可以使用
CopyTo()
获取列表的一部分并将其放入二进制数组,然后使用XmlWriter编写。要从XmlReader中读回它们,只需使用InsertRange
反序列化数据即可
阅读示例:
// elsewhere
List<byte> bytes;
// in the deserialization
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int index = 0;
int numRead = -1;
while (numRead != 0) // actually read stuff
{
numRead = reader.ReadContentAsBase64(buffer, bufferSize);
if (numRead > 0)
{
bytes.CopyTo(buffer, index, numRead);
index += numRead;
}
}
//其他地方
列表字节;
//在反序列化中
int bufferSize=1024;
字节[]缓冲区=新字节[bufferSize];
int指数=0;
int numRead=-1;
while(numRead!=0)//实际读取内容
{
numRead=reader.ReadContentAsBase64(缓冲区,缓冲区大小);
如果(numRead>0)
{
bytes.CopyTo(缓冲区、索引、numRead);
指数+=numRead;
}
}
注意:上面的代码未经测试,但可能已接近。您可以做类似的事情,但反过来,编码数据并将其写入base64。对于其他类型,只需将数组转换为字节列表
要将字节以外的其他类型放入字节数组,需要使用System.BitConverter
。这有两种方法会让您非常高兴:GetBytes
将任何基本数据类型转换为字节数组;以及ToXxx
,其中包括ToInt32
和ToBoolean
。您将负责在读入base64信息后或写出来之前自己进行转换
您可以使用BitConverter对一组字节进行逐位转换,但将数组转换为单字节数组并返回的算法由您自行设计。您将有不同的选项,具体取决于您使用的“数组”类型。它是数组、列表还是ArrayList 对于列表,您可以使用
CopyTo()
获取列表的一部分并将其放入二进制数组,然后使用XmlWriter编写。要从XmlReader中读回它们,只需使用InsertRange
反序列化数据即可
阅读示例:
// elsewhere
List<byte> bytes;
// in the deserialization
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int index = 0;
int numRead = -1;
while (numRead != 0) // actually read stuff
{
numRead = reader.ReadContentAsBase64(buffer, bufferSize);
if (numRead > 0)
{
bytes.CopyTo(buffer, index, numRead);
index += numRead;
}
}
//其他地方
列表字节;
//在反序列化中
int bufferSize=1024;
字节[]缓冲区=新字节[bufferSize];
int指数=0;
int numRead=-1;
while(numRead!=0)//实际读取内容
{
numRead=reader.ReadContentAsBase64(缓冲区,缓冲区大小);
如果(numRead>0)
{
bytes.CopyTo(缓冲区、索引、numRead);
指数+=numRead;
}
}
注意:上面的代码未经测试,但可能已接近。您可以做类似的事情,但反过来,编码数据并将其写入base64。对于其他类型,只需将数组转换为字节列表
要将字节以外的其他类型放入字节数组,需要使用System.BitConverter
。这有两种方法会让您非常高兴:GetBytes
将任何基本数据类型转换为字节数组;以及ToXxx
,其中包括ToInt32
和ToBoolean
。您将负责在读入base64信息后或写出来之前自己进行转换
您可以使用BitConverter对一组字节进行逐位转换,但将数组转换为单字节数组并返回的算法由您自己设计。如果您需要由包含Base-64文本的单个XML元素表示的单个数组,最简单的方法可能是使用(任意数量的维度数组、列表等)将其转换为字节数组,然后简单地对其进行base-64编码并将其粘贴到XML文件中。我想不出任何其他简单的方法将任意数组转换为字节数组。如果您需要由包含base-64文本的单个XML元素表示的单个数组,最简单的方法可能是使用(任意维数的数组、列表等)转换为字节数组,然后简单地对其进行base-64编码并将其粘贴到XML文件中。我想不出任何其他简单的方法可以将任意数组转换为字节数组。我最后做了一个简短的总结: 对于序列化,我使用BinaryWriter将单个元素写入到封装在MemoryStream中的字节数组中。我将写入过程分解为小块,以便MemoryStream数组保持较小。将这些小块作为带有base64编码文本内容的单个XML元素写入
反序列化与此相反;base64块被解码为字节数组;字节数组由内存流包装,并由二进制读取器读取,以将元素推入结果数组。我最后所做的快速总结: 对于序列化,我使用BinaryWriter将单个元素写入到封装在MemoryStream中的字节数组中。我将写入过程分解为小块,以便MemoryStream数组保持较小。将这些小块作为带有base64编码文本内容的单个XML元素写入
反序列化与此相反;base64块被解码为字节数组;字节数组由内存流包装,并由二进制读取器读取,以将元素推入结果数组。如果使用XmlSerializer,则可以使用数据指定XmlElementAttribute