Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将.NET数组序列化为XML作为基64?_.net_Arrays_Serialization_Base64 - Fatal编程技术网

将.NET数组序列化为XML作为基64?

将.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

我正在用C#编写一个自定义的.NET序列化程序,并希望使用XmlReader和XmlWriter将数组对象读写到XML。我想对数组进行base64编码。数组可以是1维、2维或3维,元素为布尔类型或数字类型

我完全被难住了。XmlReader和XmlWriter都有将Byte[]数组读写为base64的方法,但我不知道如何从数组到Byte[]再返回

数组可能很大,因此我更喜欢一种不涉及复制数组或一次处理一个元素的解决方案。不安全代码和托管的或本地C++都很好。如果对XML安全,我可以使用base64以外的东西


感谢您的帮助或提示。

根据您使用的“数组”类型,您将有不同的选项。它是数组、列表还是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