- c# DotNetty
wangyue4
c#开发语言
对于.NET开发者来说,DotNetty是一个开源、高性能的网络库,它是对Java平台上流行的Netty异步事件驱动网络应用程序框架的一个端口。DotNetty适用于创建各种网络应用程序,如IoT(物联网)、游戏服务器以及消息传递系统等。以下是对DotNetty核心组件的简要说明:Bootstrap类——这个类用于简化创建服务器和客户端的初始化操作。对于服务器而言,通常使用ServerBootst
- 基于DotNetty实现一个接口自动发布工具 - 通信实现
液态不合群
githubwpf.net
基于DotNetty实现通信DotNetty:是微软的Azure团队,使用C#实现的Netty的版本发布。是.NET平台的优秀网络库。项目介绍OpenDeploy.Communication类库项目,是通信相关基础设施层Codec模块实现编码解码Convention模块定义约定,比如抽象的业务Handler,消息载体NettyMessage,消息上下文'NettyContext'等自定义消息格式消
- ModBus TCP/RTU 报文解析
CHHC1880
c#开发语言
ModbusTcphttps://gitee.com/szwzhsz/Modbus-TCP-client-server-DotNetty.?_from=gitee_search固定协议格式事务标识(2byte):0000,可变(递增)协议标识(2byte):0000,固定长度(2byte):0006,可变单位标识(1byte):01,固定功能码(1byte):01,可变数据(nbyte):可变功能
- .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用W...
anmei1912
nettyc#后端
.NET跨平台RPC框架DotNettyRPCDotNettyRPC1.简介DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NETStandard2.02.产生背景传统.NET开发中遇到远程调用服务时,多以WCF为主。而WCF虽然功能强大,但是其配置复杂,不易于上手。而且未来必定是.NETCore的天下,WCF暂不支持.NETCore(只有客户端,无法建立
- 网络开发框架 ——Kestrel
shengyin714959
笔记最高笔记网络服务器运维
为什么推荐Kestrel网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestrel呢?1使用框架#网络编程是简单的,简单到大概就newSocket(),Send()发送数据,Receive()接收数据,这大概是初学者的大致感受。网络编程是复杂的,让Send()和Receive()
- DotNetty使用之Echo
码到_成功
通信c#dotNetty
一、DotNetty介绍DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口。让我们在使用时,完全可以依照Netty官方的教程来学习和使用DotNetty应用程序。那Netty又是什么尼?Netty是一个提供asynchronousevent-driven(异步事件驱动)的网络应用框架,是一个
- NET Core通过DotNetty和Lua实现MQTT通讯
voxer
MQTT应用已经非常广泛了,目前笔者团队需要用lua来实现mqtt通讯,而服务端需要使用.NetCore来实现,以下是相关技术研究的一个总结。本文主要介绍.NetCore和Lua的MQTT通讯示例。所有源代码可以从这里下载。1.MQTT协议开发之前,非常有必要仔细的了解一下MQTT协议的基本介绍和报文结构,可以参考用户“技术学习”的MQTT专栏,里面关于协议介绍的非常详细。2.MQTTLuaMQT
- DotNetty发送请求的最佳实践
顽石2019
长链接发送request/response时,绝大部分包都是小包,而每个小包都要消耗一个IP包,成本大约是20-30us,普通千兆网卡的pps大约是60Wpps,所以想要提高长链接密集IO的应用性能,需要做包的合并,也称为了scatter/gatherio或者vectorio.在linux下有readv/writev就是对应这个需求的,减少系统调用,减少pps,提高网卡的吞吐量.关于readv提高
- DotNetty学习(四)——时间服务(Time)
Henny_CHN
DotNetty
总览链接:https://blog.csdn.net/a1234012340a/article/details/91040073服务端:服务端我在这里只负责返回时间,别的什么也不想做所以只需要写一个read然后返回时间就ok了。客户端:在写客户端之前的讲解:ChannelActive方法:将会在连接被建立并且准备进行通信时被调用。一句话就够用了。low一点。客户端写一个ChannelActive请
- 『神坑』DotNetty 内存泄漏 解决办法
denghui6223
背景近来在用DotNetty实现一个文件上传下载的同步服务。其中:客户端下载服务端的文件,客户端多次请求,从服务端将文件分片下载下来,追加到本地磁盘。——非常简单的代码,都写了几十次了,驾轻就熟。问题来了可是:在进行压力测试时,我这边下载一个Win10的ISO镜像,4个G。我发现:客户端内存不停增长,直到内存溢出——我擦。VS2015内存诊断内存诊断,我们发现有很多16M(16777228字节)的
- dotnetty 整合 msgpack编解码框架
夜幕-星辰
C#
dotnetty整合msgpack编解码框架主要是作java开发的,这一段时间用到了netty,权衡之下编解码框架选择了messagepack,当然protobuf同样是是很好的一种编解码框架,只是项目中需要传对象需要支持byte[]形式,而protobuf并不支持,经过努力也只能封装出支持list的数据结构,能力有限,就选择了messagepack。对于java方面的用法就不多说了,资料有很多,
- Uragano,基于dotnetty实现的高性能RPC框架
汪泽林
RPC微服务
部分API已经做了调整,请查看最新文档我做c#开发已经11年了,一直没写过博客,不是不想写,实在是没文采,不擅长写文章。虽然不写,但是还是经常看别人写的技术博客,也关注了很多大牛的blog和公众号。最近这两年微服务很火,自己也一直在不断的学习,因为所在的公司基于成本考虑一直没有打算把项目往微服务方向转,但是自己还是花了不少时间去学习这方面的知识。微软终于开窍走上了开源的道路,希望netcore越来
- Net Core、JS/H5、Lua通过Apollo 实现mqtt通讯
voxer
接上篇NETCore通过DotNetty和Lua实现MQTT通讯,这一篇尝试并不自己实现MQTT的服务端,而是用成熟的代理服务ApacheApollo,Apollo的优点很多,支持多种协议,支持web的管理界面,安装配置和使用容易。以下示例目标是以Apollo为MQTTBroker,以NetCore,JS,Lua三种语言来实现Broker的MQTT客户端,在它们之间实现消息互通。所有源码请参考地址
- 使用DotNetty编写跨平台网络通信程序
weixin_33979363
为什么80%的码农都做不了架构师?>>>长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架。终于微软的Azure团队,使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口。让我们在使用时,完全可以依照Netty官方的教程来学习和使用DotNetty应用程序。DotNetty同时也是开源的
- C#/Java 常用轮子 (子文章)(持续更新)
xxxxxue
C#后端
----->总文章入口C#框架/类库名称介绍Topshelfwindows服务框架Quartz定时任务框架NVelocityMVC视图引擎NPOI文档读写SignalRWebSocket框架SwaggerRESTAPI文档生成工具:NSwagSwashbuckleSwifter.Json性能最佳的JSON序列化和反序列化库Newtonsoft.Json高级用法DotNetty异步事件驱动的网络应用
- DotNetty学习(五)——点对点聊天(WebSocket)
Henny_CHN
DotNetty
总览链接:https://blog.csdn.net/a1234012340a/article/details/91040073首先贴一下我的服务端代码staticasyncTaskRunServerAsync(){//方法1////申明一个主回路调度组//vardispatcher=newDispatcherEventLoopGroup();////主工作线程组,设置为1个线程//IEventL
- NET Core微服务之路:利用DotNetty实现一个简单的通信过程
另一个老李
上一篇我们已经全面的介绍过《基于gRPC服务发现与服务治理的方案》,我们先复习一下RPC的调用过程(笔者会在这一节的几篇文章中反复的强调这个过程调用方案),看下图根据上面图,服务化原理可以分为3步:服务端启动并且向注册中心发送服务信息,注册中心收到后会定时监控服务状态(常见心跳检测);客户端需要开始调用服务的时候,首先去注册中心获取服务信息;客户端创建远程调用连接,连接后服务端返回处理信息;第3步
- DotNetty项目基本了解和介绍
weixin_30794491
一、DotNetty背景介绍DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口。让我们在使用时,完全可以依照Netty官方的教程来学习和使用DotNetty应用程序。DotNetty同时也是开源的,它的源代码托管在Github上:https://github.com/azure/dotnet
- C# 搭建DotNetty客户端
一只呆毛
C#
以下是DotNetty开源项目https://github.com/Azure/DotNetty我得出的结论:(2017年3月29日)1.DotNetty只能通过vs2017进行加载;(vs2013添加项目后报错:vserror:项目的默认XML命名空间必须为MSBuildXML命名空间——去github上找是否有人提问,发现两个关键信息如下图——>于是从nuget着手!)2.不能使用marsha
- DotNetty系列二:基本使用
qq_34719168
dotnetty
开发环境:VS20171.创建二个控制台应用,.netframework4.6.1。一个服务端,一个客户端。2.nuget,将前五项引入二个控制台应用。3.服务端代码:注释写代码里了usingDotNetty.Buffers;usingDotNetty.Transport.Bootstrapping;usingDotNetty.Transport.Channels;usingDotNetty.Tr
- DotNetty完全教程(九)
聂14昊51
DotNettyC#
引导Bootstrap引导一个应用程序是指对他进行配置并且使他运行的过程。体系结构注意,DotNetty没有实现Cloneable的接口,而是直接实现了一个Clone方法。Netty实现这个接口是为了创建两个有着相同配置的应用程序,可以把一个配置整体应用到另一个上面,需要注意的是EventLoopGroup是一个浅拷贝,这就导致了拷贝的Bootstrap都会使用同一个EventLoopGroup,
- DotNetty完全教程(七)
聂14昊51
DotNettyC#
ChannelPipeline和ChannelHandleContext介绍ChannelPipeline是一系列ChannelHandler连接的实例链,这个实例链构成了应用程序逻辑处理的核心。下图反映了这种关联:ChannelHandlerContext提供了一个ChannelPipeline的上下文,用于ChannelHandler在Pipeline中的交互,这种交互十分的灵活,不仅是信息可
- DotNetty完全教程(十一)
聂14昊51
DotNettyC#
编码器和解码器定义编码器负责将应用程序可以识别的数据结构转化为可传输的数据流,解码器反之。对于应用程序来说,编码器操作出站数据,解码器操作入站数据。解码器和Handler解码器因为是处理入站数据的,所以继承了ChannelInBoundHandler.我们理解的时候可以认为解码器就是一种特殊的Handler,用于处理信息。解码器的类型ByteToMessageDecoderReplayingDec
- DotNetty完全教程(十)
聂14昊51
DotNettyC#
单元测试EmbeddedChannel介绍EmbeddedChannel是专门为了测试ChannelHandler的传输。我们先看一下他的API用一张图来描述这样的一个模拟过程编写基于xUnit的单元测试新建一个xUnit工程UnitTest新建一个用于测试EmbededChannel的工程EmbededChannelTestEmbededChannelTest工程需要引用DotNetty的类库,
- DotNetty完全教程(六)
聂14昊51
DotNettyC#
资源管理目的在处理数据的过程中,我们需要确保没有任何的资源泄漏。这时候我们就得很关心资源管理。引用计数的处理使用完ByteBuf之后,需要调整其引用计数以确保资源的释放内存内漏探测Netty提供了ResourceLeakDetector来检测内存泄漏,因为其是采样检测的,所以相关开销并不大。泄露日志检测级别手动释放消息ReferenceCountUtil.SafeRelease(this.Mess
- DotNetty完全教程(五)
聂14昊51
DotNettyC#
ChannelHandler本篇文章着重介绍ChannelHandlerChannel的生命周期我们复习一下,Channel是Socket的抽象,可以被注册到一个EventLoop上,EventLoop相当于Selector,每一个EventLoop又有自己的处理线程。复习了这部分的知识,我们就知道在Channel的生命中,有以下这么几个关键的时间节点。ChannelHandler的生命周期我们复
- DotNetty完全教程(四)
聂14昊51
DotNettyC#
ByteBufferNetty中ByteBuffer的介绍Netty的数据处理API通过两个组件暴露——abstractclassByteBuf和interfaceByteBufHolderDotNetty中有AbstractByteBufferIByteBufferIByteBufferHolder优点:它可以被用户自定义的缓冲区类型扩展;通过内置的复合缓冲区类型实现了透明的零拷贝;容量可以按需
- DotNetty完全教程(八)
聂14昊51
DotNettyC#
EventLoop介绍我们先回顾一下,EventLoop就是我们在最开始的示意图中的Selector,每个EventLoop和一个线程绑定,用于处理多个Channel。任务调度如果我们想实现延时任务的调度,比如连接成功5s之后发送一包数据,就可以用到EventLoop的计划任务ctx.Channel.EventLoop.Schedule(()=>{Console.WriteLine("delay1
- DotNetty使用之心跳机制
码到_成功
通信
因为DotNetty是从java的Netty框架仿写过来的,介绍的文档特别少,加之官方也没有提供api文档,所以之前一直不理解心跳的用法。最近忙里偷闲,稍稍研究了一番,终于有点明白了。现在将代码复制上来,留作日后查看(ps:精髓都在代码里):Uptime.Client:publicclassProgram{conststringHOST="127.0.0.1";constintPORT=8045;
- .NET Core微服务之路:利用DotNetty实现一个简单的通信过程
另一个老李
.NETCore微服务之路:利用DotNetty实现一个简单的通信过程上一篇我们已经全面的介绍过《基于gRPC服务发现与服务治理的方案》,我们先复习一下RPC的调用过程(笔者会在这一节的几篇文章中反复的强调这个过程调用方案),看下图根据上面图,服务化原理可以分为3步:服务端启动并且向注册中心发送服务信息,注册中心收到后会定时监控服务状态(常见心跳检测);客户端需要开始调用服务的时候,首先去注册中心
- PHP,安卓,UI,java,linux视频教程合集
cocos2d-x小菜
javaUIPHPandroidlinux
╔-----------------------------------╗┆
- 各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
bozch
.net.net mvc
在.net mvc5中,在执行某一操作的时候,出现了如下错误:
各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
经查询当前的操作与错误内容无关,经过对错误信息的排查发现,事故出现在数据库迁移上。
回想过去: 在迁移之前已经对数据库进行了添加字段操作,再次进行迁移插入XXX字段的时候,就会提示如上错误。
&
- Java 对象大小的计算
e200702084
java
Java对象的大小
如何计算一个对象的大小呢?
 
- Mybatis Spring
171815164
mybatis
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService userService = (CustomerService) ac.getBean("customerService");
Customer cust
- JVM 不稳定参数
g21121
jvm
-XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。当然这是在非合理设置的前提下,如果此类参数设置合理讲大大提高JVM 的性能及稳定性。 可以说“不稳定参数”
- 用户自动登录网站
永夜-极光
用户
1.目标:实现用户登录后,再次登录就自动登录,无需用户名和密码
2.思路:将用户的信息保存为cookie
每次用户访问网站,通过filter拦截所有请求,在filter中读取所有的cookie,如果找到了保存登录信息的cookie,那么在cookie中读取登录信息,然后直接
- centos7 安装后失去win7的引导记录
程序员是怎么炼成的
操作系统
1.使用root身份(必须)打开 /boot/grub2/grub.cfg 2.找到 ### BEGIN /etc/grub.d/30_os-prober ### 在后面添加 menuentry "Windows 7 (loader) (on /dev/sda1)" { 
- Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载
aijuans
oracle
Oracle 10g 官方中文安装帮助文档下载:http://download.csdn.net/tag/Oracle%E4%B8%AD%E6%96%87API%EF%BC%8COracle%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%EF%BC%8Coracle%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3 Oracle 10g 官方中文教程
- JavaEE开源快速开发平台G4Studio_V3.2发布了
無為子
AOPoraclemysqljavaeeG4Studio
我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V3.2版本已经正式发布。大家可以通过如下地址下载。
访问G4Studio网站
http://www.g4it.org
G4Studio_V3.2版本变更日志
功能新增
(1).新增了系统右下角滑出提示窗口功能。
(2).新增了文件资源的Zip压缩和解压缩
- Oracle常用的单行函数应用技巧总结
百合不是茶
日期函数转换函数(核心)数字函数通用函数(核心)字符函数
单行函数; 字符函数,数字函数,日期函数,转换函数(核心),通用函数(核心)
一:字符函数:
.UPPER(字符串) 将字符串转为大写
.LOWER (字符串) 将字符串转为小写
.INITCAP(字符串) 将首字母大写
.LENGTH (字符串) 字符串的长度
.REPLACE(字符串,'A','_') 将字符串字符A转换成_
- Mockito异常测试实例
bijian1013
java单元测试mockito
Mockito异常测试实例:
package com.bijian.study;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.
- GA与量子恒道统计
Bill_chen
JavaScript浏览器百度Google防火墙
前一阵子,统计**网址时,Google Analytics(GA) 和量子恒道统计(也称量子统计),数据有较大的偏差,仔细找相关资料研究了下,总结如下:
为何GA和量子网站统计(量子统计前身为雅虎统计)结果不同?
首先:没有一种网站统计工具能保证百分之百的准确出现该问题可能有以下几个原因:(1)不同的统计分析系统的算法机制不同;(2)统计代码放置的位置和前后
- 【Linux命令三】Top命令
bit1129
linux命令
Linux的Top命令类似于Windows的任务管理器,可以查看当前系统的运行情况,包括CPU、内存的使用情况等。如下是一个Top命令的执行结果:
top - 21:22:04 up 1 day, 23:49, 1 user, load average: 1.10, 1.66, 1.99
Tasks: 202 total, 4 running, 198 sl
- spring四种依赖注入方式
白糖_
spring
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我
- angular.injector
boyitech
AngularJSAngularJS API
angular.injector
描述: 创建一个injector对象, 调用injector对象的方法可以获得angular的service, 或者用来做依赖注入. 使用方法: angular.injector(modules, [strictDi]) 参数详解: Param Type Details mod
- java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待
bylijinnan
Integer
public class PC {
/**
* 题目:生产者-消费者。
* 同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待。
*/
private static final Integer[] val=new Integer[10];
private static
- 使用Struts2.2.1配置
Chen.H
apachespringWebxmlstruts
Struts2.2.1 需要如下 jar包: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar spring.jar
struts2-core-2.2.1.jar struts2-sp
- [职业与教育]青春之歌
comsci
教育
每个人都有自己的青春之歌............但是我要说的却不是青春...
大家如果在自己的职业生涯没有给自己以后创业留一点点机会,仅仅凭学历和人脉关系,是难以在竞争激烈的市场中生存下去的....
&nbs
- oracle连接(join)中使用using关键字
daizj
JOINoraclesqlusing
在oracle连接(join)中使用using关键字
34. View the Exhibit and examine the structure of the ORDERS and ORDER_ITEMS tables.
Evaluate the following SQL statement:
SELECT oi.order_id, product_id, order_date
FRO
- NIO示例
daysinsun
nio
NIO服务端代码:
public class NIOServer {
private Selector selector;
public void startServer(int port) throws IOException {
ServerSocketChannel serverChannel = ServerSocketChannel.open(
- C语言学习homework1
dcj3sjt126com
chomework
0、 课堂练习做完
1、使用sizeof计算出你所知道的所有的类型占用的空间。
int x;
sizeof(x);
sizeof(int);
# include <stdio.h>
int main(void)
{
int x1;
char x2;
double x3;
float x4;
printf(&quo
- select in order by , mysql排序
dcj3sjt126com
mysql
If i select like this:
SELECT id FROM users WHERE id IN(3,4,8,1);
This by default will select users in this order
1,3,4,8,
I would like to select them in the same order that i put IN() values so:
- 页面校验-新建项目
fanxiaolong
页面校验
$(document).ready(
function() {
var flag = true;
$('#changeform').submit(function() {
var projectScValNull = true;
var s ="";
var parent_id = $("#parent_id").v
- Ehcache(02)——ehcache.xml简介
234390216
ehcacheehcache.xml简介
ehcache.xml简介
ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。根据之前我们在《Ehcache简介》一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信
- junit 4.11中三个新功能
jackyrong
java
junit 4.11中两个新增的功能,首先是注解中可以参数化,比如
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runn
- 国外程序员爱用苹果Mac电脑的10大理由
php教程分享
windowsPHPunixMicrosoftperl
Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里。普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒。那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因:
1、Mac OS X 是基于 Unix 的
这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到。如果你是个 wi
- 位运算、异或的实际应用
wenjinglian
位运算
一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。
二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。
三. 位操作与空间压缩,针对筛素数进行空间压缩。
&n
- weblogic部署项目出现的一些问题(持续补充中……)
Everyday都不同
weblogic部署失败
好吧,weblogic的问题确实……
问题一:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [zip:E:/weblogic/user_projects/domains/base_domain/serve
- tomcat7性能调优(01)
toknowme
tomcat7
Tomcat优化: 1、最大连接数最大线程等设置
<Connector port="8082" protocol="HTTP/1.1"
useBodyEncodingForURI="t
- PO VO DAO DTO BO TO概念与区别
xp9802
javaDAO设计模式bean领域模型
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。
它们的关系应该是相互独立的,一个VO可以只是PO的部分,也可以是多个PO构成,同样也可以等同于一个PO(指的是他们的属性)。这样,PO独立出来,数据持