C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

別プロジェクトのシリアライズデータをデシリアライズ

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■95047 / inTopicNo.1)  別プロジェクトのシリアライズデータをデシリアライズ
  
□投稿者/ 弁慶アリ (1回)-(2020/06/17(Wed) 19:34:50)

分類:[C#] 

VisualStudio2015 .NetFramework4.0

前のプロジェクトのソースが巨大でかつ古くなってきたので現在新しいプロジェクトへ引っ越し作業を行っています。

その作業の一部として現在作っているプロジェクトで前のプロジェクトの中に定義してあるクラスでシリアライズして保存したバイナリファイルのデータを
現在作っているプロジェクトで前のプロジェクトと同名のクラスを使ってデシリアライズしようとしています。

前のアセンブリで作ったプロジェクトの中にあるクラスのバイナリデータをデシリアライズしようとしたのですが、

"アセンブリ '[前のアセンブリ名], Version=[前のアセンブリのバージョン番号], Culture=neutral, PublicKeyToken=null' が見つかりません。"

と例外エラーが発生してしまいました。

この問題を解決するにはどうすればよいでしょうか。
教えてください。

[古いプロジェクト]
private void button1_Click(object sender, EventArgs e)
{
StructCommon.Commentlist Commentlist = new StructCommon.Commentlist();

List<StructCommon.CommentData> listStructData = new List<StructCommon.CommentData>();
listStructData.Add(new StructCommon.CommentData()
{
Comment = "test1",
Value = 1
});

listStructData.Add(new StructCommon.CommentData()
{
Comment = "test2",
Value = 2
});

listStructData.Add(new StructCommon.CommentData()
{
Comment = "test3",
Value = 3
});

listStructData.Add(new StructCommon.CommentData()
{
Comment = "test4",
Value = 4
});

listStructData.Add(new StructCommon.CommentData()
{
Comment = "test5",
Value = 5
});

Commentlist.listData = new List<StructCommon.CommentData>(listStructData);

using (FileStream fStream = new FileStream(@"C:\test\comment.dat", FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
using (Stream stream = Stream.Synchronized(fStream))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(stream, Commentlist);
}
}
}

[新しいプロジェクト]

private void button1_Click(object sender, EventArgs e)
{
StructCommon.Commentlist OldCommentData;

using (FileStream fStream = new FileStream(@"C:\test\comment.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (Stream stream = Stream.Synchronized(fStream))
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(stream); //ここで例外エラーが発生。
OldCommentData = (StructCommon.Commentlist)obj;
}
}

foreach (StructCommon.CommentData Cdata in OldCommentData.listData)
{
MessageBox.Show(Cdata.Comment);
}
}

[新旧それぞれのプロジェクトに定義]
class StructCommon
{
[Serializable()]
public struct Commentlist
{
public List<CommentData> listData;
}

[Serializable()]
public struct CommentData
{
public string Comment;
public int Value;
}
}
引用返信 編集キー/
■95048 / inTopicNo.2)  Re[1]: 別プロジェクトのシリアライズデータをデシリアライズ
□投稿者/ PANG (1回)-(2020/06/18(Thu) 09:18:41)
No95047 (弁慶アリ さん) に返信
> "アセンブリ '[前のアセンブリ名], Version=[前のアセンブリのバージョン番号], Culture=neutral, PublicKeyToken=null' が見つかりません。"

BinaryFormatterのプロパティにチェックを緩くしてくれそうなものがあります。
引用返信 編集キー/
■95052 / inTopicNo.3)  Re[2]: 別プロジェクトのシリアライズデータをデシリアライズ
□投稿者/ 弁慶アリ (2回)-(2020/06/18(Thu) 22:02:23)
No95048 (PANG さん) に返信
> ■No95047 (弁慶アリ さん) に返信
>>"アセンブリ '[前のアセンブリ名], Version=[前のアセンブリのバージョン番号], Culture=neutral, PublicKeyToken=null' が見つかりません。"
>
> BinaryFormatterのプロパティにチェックを緩くしてくれそうなものがあります。

ありがとうございます。
FilterLevelプロパティですね。
Lowに下げてみたのですが、例外エラーは消えませんでした。

そこで別の方法を調べてみた結果、Binderをいじる方法で解決しました。

public class CustomBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
if (typeName.IndexOf("[前のアセンブリ名]") != -1)
return Type.GetType(typeName.Replace("[前のアセンブリ名]", "[新しいアセンブリ名]"));

return null;
}
}

もっと簡単な方法があるかもしれませんが、この方法で様子を見ようと思います。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ