在进行序列化与反序列化的时候,程序出错了:
“二进制流“69”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。”
/// <summary>
/// 对接收到或待发送数组做序列化与反序列化的类
/// </summary>
public class BufferHelper
/// <summary>
/// 对一个传入的对象序列化为数组
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static byte[] Serialize(object obj)
BinaryFormatter bf = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bf.Serialize(stream, obj);
byte[] datas = stream.ToArray();
stream.Dispose();
return datas;
/// <summary>
/// 将一个字节数组反序列化为一个对象
/// </summary>
/// <param name="datas"></param>
/// <param name="index"></param>
/// <returns></returns>
public static object Deserialize(byte[] datas, int index)
BinaryFormatter bf = new BinaryFormatter();
MemoryStream stream = new MemoryStream(datas, index, datas.Length - index);
object obj = bf.Deserialize(stream);
stream.Dispose();
return obj;
找了很久,一直没找到问题的原因,后来突然发现是在传入byte[] datas时,从其他地方传入的数组不完整,这应该是造成了无效流,所以出错。
我们在使用Array.Copy()复制数组时,一定要使目标数组大小能够接受完整的源数组数据。
在进行序列化与反序列化的时候,程序出错了:“二进制流“69”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。”/// /// 对接收到或待发送数组做序列化与反序列化的类 /// public class BufferHelper { /// ///
它可以指定你希望对集合进行的操作,
可以执行非常复杂的查找、过滤和映射数据等操作。
使用
Stream
API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用
Stream
API 来并行执行操作。
简而言之,Stre...
好了,背景知识介绍完成,并且我们在最开始也对
Stream
有了一个大致的了解,在本章中我们详细的介绍一下
Stream
,每一个示例都会有相应的代码配合,让读者理解更加的透彻。
对
Stream
的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect),当我们使用
流
的时候,通常会包括三个基本的步骤:
list.
stream
()
2.2、中间操作
一个
流
后面可以跟随零个或多个中间操作,其目的主要是打开
流
,做出某种程度的数据过滤/映射,然后返回一个新的
流
,交给下一个操作使用
filter()
2.3、终结操作
一个
流
只能有一个终结操作,当这个操作执行后,
流
就被使用"光"了,无法再被操作。所以这必定是
流
的最后一个操作
forEach
2.4、案例
public
class
Demo1 {
计算一个字符串中小写字母的个数( 提示: 参阅 String 对象的 chars 方法)。
在一个字符串列表中, 找出
包含
最多小写字母的字符串。 对于空列表, 返回 Optional
<String> 对象
第一个比较简单
import java.util.ArrayList;
import java.util.Comparator;
import java.u......
说到
Stream
便容易想到I/O
Stream
,而实际上,谁规定“
流
”就一定是“IO
流
”呢?在Java 8中,得益于Lambda所带来的函数式编程
引入了一个全新的
Stream
概念,用于解决已有集合+数组既有的弊端。
使用
Stream
流
的方式,遍历集合,对集合中的数据进行过滤
Stream
流
是JDK1.8之后出现的
关注的是做什么,而不是怎么做
publ...
Stream
流
编程
Stream
不是集合元素,也不是数据结构,它相当于一个 高级版本的 Iterator,不可以重复遍历里面的数据,像水一样,
流
过了就一去不复返。它和普通的 Iterator 不同的是,它可以并行遍历,普通的 Iterator 只能是串行,在一个线程中执行。
外部迭代与内部迭代
使用for等进行迭代我们叫做外部迭代,使用
stream
流
迭代叫做内部迭代。
public
class
S...
Stream
是Java8最大的亮点,它是对集合对象功能的增强,专注于对集合对象进行各种高效的数据处理,
Stream
API借助于lambda表达式极大的提高了编程效率及程序的可读性,同时
Stream
提供串行和并行两种模式进行汇聚操作,并行模式可以充分利用多核处理器的优势。结合lambda表达式及
Stream
API可以很方便的编写高性能并发程序。
在操作数据库时,S
在Java中,
二进制
流
通常是用字节
流
来表示的。字节
流
可以读取和写入字节数据,因此可以用来处理
二进制
数据。在处理
二进制
数据时,我们可以使用Java中的 FileInput
Stream
和 FileOutput
Stream
类来读写字节
流
。例如,以下代码可以将
二进制
文件中的数据读取到字节数组中:
File file = new File("data.bin");
byte
[] data = new
byte
[(int)file.length()];
FileInput
Stream
fis = new FileInput
Stream
(file);
fis.read(data);
fis.close();
类似地,我们可以将字节数组写入到
二进制
文件中:
File file = new File("data.bin");
byte
[] data = new
byte
[] {0x01, 0x02, 0x03};
FileOutput
Stream
fos = new FileOutput
Stream
(file);
fos.write(data);
fos.close();
在这里,我们使用了十六进制的字面量来表示
二进制
数据。例如,0x01 表示
二进制
数 00000001。因此,字节数组 {0x01, 0x02, 0x03} 表示
二进制
数据 00000001 00000010 00000011。