📄 rfcrfc2713.txt
字号:
RMI能被不能的协议所支持:JAVA远程方法协议(JRMP)和互联网Inter-ORB协议
(IIOP)。JRMP是专为RMI设计的协议;IIOP是CORBA对象间通信的标准协议
[CORBA] 。基于IIOP的RMI允许JAVA远程对象与可能是用非JAVA语言编写的
CORBA对象进行通信 [RMI – IIOP] 。
2.5.1 目录中的表征
使用IIOP的远程对象在目录中被作为CORBA对象参考来表征 [CORBA – LDAP] 。
使用JRMP的远程对象在目录中用一种或两种方法来表征:作为整理过的对象,或作为
JNDI参考。
一个整理过的对象记录远程对象存根(stub)和任何可序列化的或远程的所参考的对象
的代码存根,并且用它们的存根(stubs)代替远程对象。为将一个远程对象作为整理
过的对象(java.rmi.MarshalledObject)来保存,你应先创建一个它的
java.rmi.MarshalledObject实例。
java.rmi.Remote robj = ...;
java.rmi.MarshalledObject mobj = new java.rmi.MarshalledObject(robj);
然后你可以将此MarshalledObject实例作为javaMarshalledObject来保存。javaClassName
属性应该包含此远程对象的完整的知名类名。javaClassNames属性应该包含远程对象的
类和接口的名字。欲从目录中读回远程对象,先要逆序列化javaSerializedData的内容
以得到一个MarshalledObject(mobj),然后像如下那样从该MarshalledObject恢复:
java.rmi.Remote robj = (java.rmi.Remote)mobj.get();
本语句返回远程存根(stub),你可用来调用远程方法。
MarshalledObject只在Java2 Platfrom, Standard Edition, V1.2或更高版本的平台上可用。
因此,作为MarshalledObject保存的远程对象只能被使用Java2 Platfrom, Standard Edition,
V1.2或更高版本平台的客户所读取。
欲将JNDI参考保存为远程对象,你得先创建一个javax.naming.Reference对象实例,因
为它使用远程对象的名字就像它已经或将要被记录在RMI注册器上,并且存在附加限
制"rmi:"前缀。这里是例子:
javax.naming.Reference ref = new javax.naming.Reference(
obj.getClass().getName(),
new javax.naming.StringRefAddr("URL",
"rmi://rserver/AppRemoteObjectX"));
然后你可将此javax.naming.Reference实例作为javaNamingReference保存。使用JNDI
参考的好处在于可以没有远程对象的参考时进行。实事上,该远程对象不必在目录中的
这个记录产生时就存在。在远程对象被从目录中查找时是必须存在的,而且要被捆定在
RMI注册器中。
2.6 序列化的对象 VS. 整理过的对象 VS. 参考
本文定义的对象类保存JAVA对象的不同方面。
一个作为javaMarshalledObject保存的javaNamingReference或远程对象表征一个指向对
象的指针时,作为javaMarshalledObject保存的javaSerializedObject或可序列化的对象
表征对象自己。
保存一个可序列化的对象到目录中时,你拥有作为javaSerializedObject还是作为
javaMarshalledObject保存的选择。javaSerializedObject对象类提供保存可序列化对象的
基本方法。当用javaSerializedObject对象类创建一个LDAP记录时,如果你希望该记录
的读取者知道到哪里加载该对象的类定义,你必须明确地设置javaCodeBase属性。当
用javaMarshalledObject对象类创建一个LDAP目录记录时,你要使用MarshalledObject
类。MarshalledObject类使用在JAVA平台上可用的RMI下部构造,使聚集与记录代码
存根(codebase)信息自动化,从而使设置javaCodeBase属性变得不是必需的。另一方
面,javaCodeBase属性是肉眼可读的,是可以在不必改变记录的其它部分的前提下轻易
用文本工具更新。这就使得你,例如,移动类定义到别的地方并且更新javaCodeBase
属性来体现移动而不必更新序列化的对象自己。javaNamingReference提供一种记录没
有直接保存于目录中的对象的地址的信息。作为javaMarshalledObject保存的远程对象
也记录自己没直接保存于目录中的对象的地址信息。换句话说,你可以把它们看成是访
问对象必需的信息的简洁的表征。
javaNamingReference一般地由一个肉眼可读的小数字字符组成。目录管理的标准文本
工具可因此用来添加,读取,或修改参考记录――如若很需要――非常容易。序列化的
与整理过的对象不会被人直接地读取或操作。
3、属性类型定义
以下属性类型在本文本中定义:
javaClassName
javaClassNames
javaCodebase
javaSerializedData
javaFactory
javaReferenceAddress
javaDoc
3.1 javaClassName
该属性保存JAVA对象的“知名的”类或接口(如,java.lang.String)的完整名字。它
是个单值属性。其语法是 'Diretory String' 而且是大小写无关的。
( 1.3.6.1.4.1.42.2.27.4.1.6
NAME 'javaClassName'
DESC 'Fully qualified name of distinguished Java class or
interface'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE
)
3.2 javaCodebase
该属性保存JAVA类定义的位置。它指定加载由javaClassName属性指定的类的类定义
的位置。每个属性的值包含一个有序的URL列表,由空格分开。比如,值“url1 url2 url3”
表示三个(可能互相依赖的)URL(url1, url2, url3)构成用于加载JAVA类定义的代码
存根(codebase)。
该属性的语法是 'IA5 String',而且是大小写无关的。
( 1.3.6.1.4.1.42.2.27.4.1.7
NAME 'javaCodebase'
DESC 'URL(s) specifying the location of class definition'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
)
3.3 javaClassNames
该属性保存JAVA对象的完整类或接口名(如,java.lang.String)。它是多值的属性。当
多于一个值存在时,每一个是类或接口或该对象父类或父接口的名字。
该属性的语法为 'Directory String' ,并且大小写无关。
( 1.3.6.1.4.1.42.2.27.4.1.13
NAME 'javaClassNames'
DESC 'Fully qualified Java class or interface name'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
3.4 javaSerializedData
该属性保存JAVA对象的序列化形态。序列化形态在 [Serial] 中描述。
该属性的语法为 'Octet String'。
( 1.3.6.1.4.1.42.2.27.4.1.8
NAME 'javaSerializedData
DESC 'Serialized form of a Java object'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
SINGLE-VALUE
)
3.5 javaFactory
该属性保存能被用来创建由javaClassName属性标识的对象实例的对象制造者(如,§
com.wiz.jndi.WizObjectFactory)的完整的类名。
该属性的语法是 'Directory String',并且大小写无关。
( 1.3.6.1.4.1.42.2.27.4.1.10
NAME 'javaFactory'
DESC 'Fully qualified Java class name of a JNDI object factory'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE
)
3.6 javaReferenceAddress
该属性表征JNDI参考的地址序列。它的每个值表示一个地址,一个类型为
javax.naming.RefAddr的JAVA对象。它的值是地址类型和地址内容的串联,并以一个
序号打头(JNDI参考中的地址顺序是很重要的)。比如:
#0#TypeA#ValA
#1#TypeB#ValB
#2#TypeC##rO0ABXNyABpq...
详细地讲,这个值如下编码:
分隔符是值的第一个字符。为了易读性,字符“#”在值中没被另外地使用时是推荐使
用,而且任何字符可以用来服从下面给出的限制。
每一个分隔符跟着是序列号。地址的序列号是它在JNDI参考中的位置,第一的位置编
号为0。它用最简短的十进制形式表示。
序列号接下来是一个分隔符,然后是地址类型,然后是另一个分隔符。如果地址属于
JAVA类javax.naming.StringRefAddr,则其分隔符接着的是地址内容的值(字符)。否则,
分隔符接着是另一个分隔符,然后接着是这整个地址的序列化形态的Base64编码。
分隔符可以是任何未包含在地址类型中的数字或字符。另外,若地址内容是个字符串,
分隔符不能为此字符串的首字符。
该属性的语法为 'Directory String',并且大小写无关。它可以含有多个值。
( 1.3.6.1.4.1.42.2.27.4.1.11
NAME 'javaReferenceAddress'
DESC 'Addresses associated with a JNDI Reference'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
3.7 javaDoc
该属性保存指向类的JAVA文档的指针。其值为URL。比如,以下URL指向
java.lang.String类的说明:
http://java.sun.com/products/jdk/1.2/docs/api/java/lang/String.html
该属性语法为 'IA5 String',并且大小写无关。
( 1.3.6.1.4.1.42.2.27.4.1.12
NAME 'javaDoc'
DESC 'The Java documentation for the class'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
)
4.对象类的定义
下面对象类在本文中定义:
javaContainer
javaObject
javaSerializedObject
javaMarshalledObject
javaNamingReference
4.1 javaContainer
该结构上的对象类表示一个JAVA对象的容器。
( 1.3.6.1.4.1.42.2.27.4.2.1
NAME 'javaContainer'
DESC 'Container for a Java object'
SUP top
STRUCTURAL
MUST ( cn )
)
4.2 javaObject
该抽象对象类表示一个JAVA对象。javObject不能存在于目录中;只有其辅助的或结构
上的子类可以存在于目录中。
( 1.3.6.1.4.1.42.2.27.4.2.4
NAME 'javaObject'
DESC 'Java object representation'
SUP top
ABSTRACT
MUST ( javaClassName )
MAY ( javaClassNames $
javaCodebase $
javaDoc $
description )
)
4.3 javaSerializedObject
该辅助对象类表示一个序列化的JAVA对象。必须与一个结构上的对象类混合在一起。
( 1.3.6.1.4.1.42.2.27.4.2.5
NAME 'javaSerializedObject'
DESC 'Java serialized object'
SUP javaObject
AUXILIARY
MUST ( javaSerializedData )
)
4.4 javaMarshalledObject
该辅助对象类表示一个整理过的JAVA对象。它必须与一个结构上的对象类相混合。
( 1.3.6.1.4.1.42.2.27.4.2.8
NAME 'javaMarshalledObject'
DESC 'Java marshalled object'
SUP javaObject
AUXILIARY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -