C#でJavaでオブジェクトのシリアル化をエミュレートするにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/4496190

質問

C#を使用してJavaアプレットの自動化のためにサーブレットコールを呼び出す必要があります。 Javaアプレットは、URL接続オブジェクトを使用してサーブレットと呼ぶことです。

URL servlet = new URL(servletProtocol, servletHost, servletPort, "/" + ServletName);
URLConnection con = servlet.openConnection();
con.setDoOutput(true);
ObjectOutputStream out = new ObjectOutputStream(con.getOutputStream());
// Write several parameters strings
out.writeObject(param[0]);
out.writeObject(param[1]);
out.flush();
out.close();

問題は、C#を使用してこれをシミュレートする必要があることです。対応するオブジェクトはhttpwebrequestになると思います

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(servletPath);
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream=myRequest.GetRequestStream();
// Send the data.
newStream.Write(param[0],0,param[0].length);
newStream.Write(param[1],0,param[1].length);
newStream.Close();

文字列をシリアル化されたJava文字列として書くにはどうすればよいですか?ここに回避策はありますか? JavaのObjectOutputStreamのドキュメントによると、プリミティブタイプを除いてオブジェクトをシリアル化します。文字列がクラスであることを知っているので、オブジェクトや特別なケースのようにシリアル化しますか?

私は1つのソリューションを試しました。IKVM(http://www.ikvm.net/)Java仮想マシンを参照にインポートし、Javaのjava.ioライブラリを使用しようとしています。不明確なことに、ObjectInputStreamコンストラクターと呼ばれると、「無効なストリームヘッダー」がスローされます。

これが私の変更されたコードです:

myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();

// Send the data.
newStream.Write(data, 0, data.Length);
newStream.Close();

List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
    while (sr.Peek() >= 0)
    {
        lByte.Add((byte)sr.Read());
    }
}

byte[] bArr = lByte.ToArray();
ObjectInputStream inputStream = null;

try
{
    //Construct the ObjectInputStream object
    inputStream = new ObjectInputStream(new ByteArrayInputStream(bArr));

    Object obj = null;

    while ((obj = inputStream.readObject()) != null)
    {
        string objStr = obj as string;
    }


}
catch (java.lang.Exception ex)
役に立ちましたか?

解決 2

私はついにこれを機能させることができました。

問題は、StreamReaderを使用する代わりに.NETでデータを読み取ることです。ストリームオブジェクトをすぐに使用する必要があります。とにかく、ここにそれを残して、それが他の人が彼らの問題に役立つのを助けるからです:

不正なコード:

List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
    while (sr.Peek() >= 0)
    {
        lByte.Add((byte)sr.Read());
    }
}

正しいコード:

byte[] buffer = new byte[1000];
using (Stream sr = myRequest.GetResponse().GetResponseStream())
{
    sr.Read(buffer, 0, 1000);
}

他のヒント

Java側でのシリアル化/脱介入を制御できる場合、最善の策は、プロトコルバッファーなどのクロスプラットフォームシリアル化プロトコルを使用することです。 C ++、Java、およびPythonの場合:

http://code.google.com/p/protobuf/

.netの場合、Jon Skeetはポートを書きました:

http://code.google.com/p/protobuf-net/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top