- PR -

ZedGraphを機能そのままに保存したい(SoapSerialize)

1
投稿者投稿内容
カセイ
会議室デビュー日: 2008/11/20
投稿数: 7
投稿日時: 2008-11-20 14:30
はじめまして、カセイと申します。
ZedGraphとVB.net(Express Edition)を使用してグラフを作成しています。
ZedGraphWikiには下記のコードをForm1.csにコピーして使用することで、グラフの機能を保持したまま保存が出来るとありましたので試したところ**のコードで
「SerializationInfoオブジェクトに同じメンバを2回追加することは出来ません」
というエラーが出てしまいます。

Private Sub SoapSerialize(ByVal z1 As ZedGraphControl, ByVal fileName As String)
 If zgc IsNot DBNull.Value And Not String.IsNullOrEmpty(fileName) Then
  Dim mySerializer As SoapFormatter = New SoapFormatter()
  Dim myWriter As FileStream = New FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)

  mySerializer.Serialize(myWriter, z1.MasterPane)**
  myWriter.Close()
 End If
End Sub

Private Sub SoapDeSerialize(ByVal z1 As ZedGraphControl, ByVal fileName As String)
 If zgc IsNot DBNull.Value And Not String.IsNullOrEmpty(fileName) Then
  Dim mySerializer As SoapFormatter = New SoapFormatter()
  Dim myReader As FileStream = New FileStream(fileName,FileMode.Open,FileAccess.Read, FileShare.Read)
  Dim master As MasterPane = mySerializer.Deserialize(myReader)

  z1.Refresh()
  myReader.Close()
  z1.MasterPane = master
  z1.Size = zgc.Size
 End If
End Sub

ZedGraphWikiではC#のコードでしたので、VBでは不可なのでしょうか。
それとも、Serializeを使用しているらしいので、新しくClassを追加すればVBでも使用できるのでしょうか。

ご存知の方がいらっしゃいましたら、なにとぞご教授の方宜しくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-11-20 14:52
引用:

カセイさんの書き込み (2008-11-20 14:30) より:

ZedGraphWikiではC#のコードでしたので、VBでは不可なのでしょうか。


VB への移行でミスがなければ、.NET Framework の機能しか使っていないので言語の違いは関係ないです。

引用:

それとも、Serializeを使用しているらしいので、新しくClassを追加すればVBでも使用できるのでしょうか。


例外の情報を見る限り違うと思います。

元データが悪い可能性がありますので、「単純なグラフで保存できるかどうか」 を確認して原因を絞り込むのが早道かと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
カセイ
会議室デビュー日: 2008/11/20
投稿数: 7
投稿日時: 2008-11-20 15:31
じゃんぬねっと様
お返事ありがとう御座います。

ただいま
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles MyBase.Load
  Graph(zgc)
 End Sub

 Public Sub Graph(ByVal zgc As ZedGraphControl)
  Dim myPane As GraphPane = zgc.GraphPane
  Dim i As Double = 0.0
  Dim list As New PointPairList
  Dim x As Double
  Dim y As Double

   For i = 0 To 100
    x = i * 5.0 + 25.0
    y = Math.Sin(i * Math.PI / 25.0) * 16.0
    list.Add(x, y)
   Next

  Dim myCurve As LineItem
  myCurve = myPane.AddCurve("Alpha", list, Color.Red)
  zgc.AxisChange()
 End Sub

としてサイン波形をつくり、このグラフを保存しようとしておりますが、
エラーに変化はありません。
どうやら
「 myCurve = myPane.AddCurve("Alpha", list, Color.Red) 」
のコードに問題があるようなのですが、何の名前が問題なのか全く判っておりません。



エラーの起きている「 mySerializer.Serialize(myWriter, z1.MasterPane) 」のローカルを調べましたところ
「 Item インデックス付きのプロパティを評価するためには、プロパティが限定されていて、ユーザーにより引数が明示的に指定されていなければなりません。  ZedGraph.GraphPane 」
とありました。
何かを定義すればよいのでしょうか。

[ メッセージ編集済み 編集者: カセイ 編集日時 2008-11-20 15:47 ]

[ メッセージ編集済み 編集者: カセイ 編集日時 2008-11-20 15:50 ]
Tram
常連さん
会議室デビュー日: 2002/10/10
投稿数: 21
お住まい・勤務地: 横浜
投稿日時: 2008-11-21 10:50
C#で試してみましたが同様の現象になるので
ZedGraphのソースを眺めてみました。
エラーが発生する ZedGraph.Line.GetObjectData のコードは以下の通り。
コード:
[SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )]
public override void GetObjectData( SerializationInfo info, StreamingContext context )
{
	base.GetObjectData( info, context );

	info.AddValue( "schema", schema );
	info.AddValue( "color", _color );
	info.AddValue( "stepType", _stepType );
	info.AddValue( "isSmooth", _isSmooth );
	info.AddValue( "smoothTension", _smoothTension );
	info.AddValue( "fill", _fill );

	info.AddValue( "isOptimizedDraw", _isOptimizedDraw );
}


ここでは基底クラス(LineBase)の GetObjectData() を呼んでますが、
そこのコードは以下の通り。
コード:
[SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )]
public virtual void GetObjectData( SerializationInfo info, StreamingContext context )
{
	info.AddValue( "schema0", schema0 );

	info.AddValue( "width", _width );
	info.AddValue( "style", _style );
	info.AddValue( "dashOn", _dashOn );
	info.AddValue( "dashOff", _dashOff );
	info.AddValue( "isVisible", _isVisible );
	info.AddValue( "isAntiAlias", _isAntiAlias );
	info.AddValue( "color", _color );
	info.AddValue( "gradientFill", _gradientFill );
}


太字の箇所を見ていただけるとお判りのように"color"を二重にセットしています。
Line側の不要な info.AddValue( "color", _color ); をコメントアウトしたDLLで試したところ
当方の環境では(C#ですが)問題なく保存できるようになりました。
つまり、ZedGraph側の問題のように思えます…。
ご参考までに。
カセイ
会議室デビュー日: 2008/11/20
投稿数: 7
投稿日時: 2008-11-21 12:30
Tram様
お返事ありがとう御座います。

Tram様の検証のおかげで原因がわかりスッキリしました。

スキル不足のためVBではどのように改良したらよいか思いつきませんので、
Tram様のコードを参考にしながらGetObject関数あたりを調べてみようかと思います。

Tram
常連さん
会議室デビュー日: 2002/10/10
投稿数: 21
お住まい・勤務地: 横浜
投稿日時: 2008-11-21 13:56
引用:

カセイさんの書き込み (2008-11-21 12:30) より:
スキル不足のためVBではどのように改良したらよいか思いつきませんので、
Tram様のコードを参考にしながらGetObject関数あたりを調べてみようかと思います。


いえ、ZedGraph自身の問題だと思いますので、ZedGraph側を直さないとダメかと。
ソースも公開されていますのでダウンロードして
Line.cs 内の前述の箇所をコメントアウトした上でビルドし直せば
少なくとも今回の問題については回避できるかと思います。
ただし、ZedGraphはLGPLライセンスですので扱いにはご注意を。
カセイ
会議室デビュー日: 2008/11/20
投稿数: 7
投稿日時: 2008-11-21 17:30
Tram様
ご丁寧にありがとう御座います。

どうやら私はあさっての方向を向いていたようですね。
社内のパソコンはExpress Editionのため.csのプログラムをビルドできませんので、
家庭のパソコンで行ってみようと思います。

起動結果はまた後に書き込ませていただきます。
カセイ
会議室デビュー日: 2008/11/20
投稿数: 7
投稿日時: 2008-11-25 09:45
ご指示のように.cvを変更したら正しく動作するようになりました。
(ライセンスの件ですが、このプログラムは特に配布する予定はありませんので大丈夫だとは思いますが、気をつけます。)

じゃんぬねっと様、Tram様
このたびは、私の問題にお付き合いいただき誠にありがとう御座います。

本件はこれにて【解決済み】とさせていただきます。
ありがとう御座いました。

[ メッセージ編集済み 編集者: カセイ 編集日時 2008-11-25 09:47 ]
1

スキルアップ/キャリアアップ(JOB@IT)