Re: desreializer

2005-07-21 スレッド表示 FUJIMOTO Jun
Toshiyuki Kimura wrote:

 To: 藤本さん

  はじめまして。木村です。

  残念ながら、この問いに対する答えは『無理です』ということに
 なってしまいます...。

  もし、クラスFooがJavaBeanであれば、BeanSerializerを利用する
 ことが可能ですが、想定されている条件はそのようなケースではない
 たいめです。ご本人独自でシリアライザ・デシリアライザを実装して
 カスタムシリアライゼーションを行う必要があると思います。

  具体的にどのような利用方法を検討されているのかは不明ですが
 「org.apache.axis.encoding.ser.ArraySerializer.java」の実装
 などが、(もしかしたら)参考になるのではないかと思います。

 初めまして 藤本と申します

 AXISの勉強をしていて,シリアライザとデシリアライザを自分で
 定義してみようと思いましたが以下のような場合についての
 簡単なサンプルを提示していただけませんか

 1.クラスBarとクラスBazにはシリアライザとデシリアライザが
 定義されている.
 2.クラスFooはFoo(Bar bar, Baz baz)というpublicなコンストラクタ
 を持つがインスタンスフィールドにはBarとBazを持たない.
 3.Fooはデフォルトコンストラクタを持たない.

 このような場合FooのデシリアライザをBarとBazのデシリアライザ
 を利用して定義するには?

どうもありがとうございます.

私はまだAXISについてほとんどわかっていないばかりでなく,
MLの利用法もわからず,やっと私のメールがML内で有効になっていること
が今し方わかりました(sendに対してフィルターをかけていたので一つも捕まらず
今までずいぶん寂しいMLだと思いこんでいました.)

デシリアライズの実装についてMapSerializer等のソースを眺めて見たのですが
わからないので取りあえずもっと簡単なところから始めようとして,まずBeanの
プロパティ
がBeanである場合について自分なりに(シリアライザは実装せずに
BeanSerializerを使って)
スタブ等つくってみましたが,以下の例外となります

致命的: 例外発生: / [en]-(Exception:)
java.lang.IllegalArgumentException: object is not an instance of
declaring class

Beanのプロパティが基本的な型のときはうまくいったのですが何が悪いのでしょうか

スタブは

import java.net.MalformedURLException;
import java.rmi.RemoteException;

import org.apache.axis.AxisFault;
import org.apache.axis.client.Call;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import static org.apache.axis.encoding.XMLType.*;

public class Service
{
private static final String _SERVICE_NAME = FooService;
private static final String _ENDPOINT =
http://localhost:8080/axis/services/; + _SERVICE_NAME;
private static final QName _BAR_QNAME =
new QName( urn:FooService, Bar );
private static final QName _BAZ_QNAME =
new QName( urn:FooService, Baz );

private Call _call;

public Service()
{
try
{
_call = new Call(_ENDPOINT);
_call.registerTypeMapping(Bar.class, _BAR_QNAME,
new org.apache.axis.encoding.ser
.BeanSerializerFactory
(Bar.class, _BAR_QNAME),
new org.apache.axis.encoding.ser
.BeanDeserializerFactory
(Bar.class, _BAR_QNAME));
_call.registerTypeMapping(Baz.class, _BAZ_QNAME,
new org.apache.axis.encoding.ser
.BeanSerializerFactory
(Baz.class, _BAZ_QNAME),
new org.apache.axis.encoding.ser
.BeanDeserializerFactory
(Baz.class, _BAZ_QNAME));
}
catch(MalformedURLException e)
{
assert false : Error: + e.toString();
}
}

public void exec(final Bar bar)
{
try
{
_call.removeAllParameters();
_call.setOperationName( new QName(_SERVICE_NAME, exec) );
_call.addParameter(arg1, _BAR_QNAME, ParameterMode.IN );
_call.setReturnType(AXIS_VOID);
_call.invoke( new Object[]{project, } );
}
catch (AxisFault fault)
{
assert false : Error :  + fault.toString();
}
catch (RemoteException fault)
{
assert false : Error :  + fault.toString();
}
}
}

WSDDは

service name=FooService provider=java:RPC
parameter name=className value=Service/
parameter name=allowedMethods value=*/
parameter name=scope value=application/
beanMapping qname=prj:Bar xmlns:prj=urn:FooService
languageSpecificType=Bar
/
beanMapping qname=prj:Baz xmlns:prj=urn:FooService
languageSpecificType=Baz
/
/service

でBazはBarのプロパティです(getBaz,setBazがある).








-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: desreializer

2005-07-21 スレッド表示 Toshiyuki Kimura

 木村です。

 上手くいったようで何よりです。

 シリアライザは、APIを使ってもWSDDを使ってもどちらでも
正しく設定していれば問題なく無く動作します。藤本さんの
場合は、WSDDのtypeMappingの指定が誤っていたのですが、
APIを使ったシリアライザの登録も重複して実施しているため
たまたま動作しているような状況だと推測します。

 やはり正しくWSDDを記載し、AdminClientを使ったデプロイ
を行うことをお勧めします。(server-config.wsddの直接編集
は、さまざまな問題を引き起こす可能性があるため、なれる
までできるだけ避けたほうが良いと思います。)

---
Toshi [EMAIL PROTECTED]

On Fri, 22 Jul 2005, FUJIMOTO Jun wrote:


今原因がわかりました.

スタブでのシリアライザ登録のとき間違って別の
オブジェクトを指定していたものです.

わからないことだらけなのでWSDDの書き方が間違っているのかと
思い(ちょっとデプロイがまともに動いてないこともあって)
ご迷惑をおかけしました.


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: desreializer

2005-07-12 スレッド表示 Toshiyuki Kimura

To: 藤本さん

 はじめまして。木村です。

# 前メールの文字コードがUTF-8となっており、環境によっては
#文字化けを起こしていた可能性があるため、再送しておきます。


このような場合FooのデシリアライザをBarとBazのデシリアライザ
を利用して定義するには?


 残念ながら、この問いに対する答えは『無理です』ということに
なってしまいます...。

 もし、クラスFooがJavaBeanであれば、BeanSerializerを利用する
ことが可能ですが、想定されている条件はそのようなケースではない
たいめです。ご本人独自でシリアライザ・デシリアライザを実装して
カスタムシリアライゼーションを行う必要があると思います。

 具体的にどのような利用方法を検討されているのかは不明ですが
「org.apache.axis.encoding.ser.ArraySerializer.java」の実装
などが、(もしかしたら)参考になるのではないかと思います。

よろしくお願いします。
--
Toshi [EMAIL PROTECTED]

On Wed, 13 Jul 2005, FUJIMOTO Jun wrote:


初めまして 藤本と申します

AXISの勉強をしていて,シリアライザとデシリアライザを自分で
定義してみようと思いましたが以下のような場合についての
簡単なサンプルを提示していただけませんか

1.クラスBarとクラスBazにはシリアライザとデシリアライザが
定義されている.
2.クラスFooはFoo(Bar bar, Baz baz)というpublicなコンストラクタ
を持つがインスタンスフィールドにはBarとBazを持たない.
3.Fooはデフォルトコンストラクタを持たない.

このような場合FooのデシリアライザをBarとBazのデシリアライザ
を利用して定義するには?

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]