「.NET」カテゴリーアーカイブ

Windowsでgem install jsonでエラー

Windows環境で、gemでjsonをインストールしようとしたら、以下のエラーになった。

$ gem install json
Building native extensions.  This could take a while...
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.
c:/ruby/bin/ruby.exe extconf.rb install json
creating Makefile
nmake
'nmake' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
Gem files will remain installed in c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2 for
 inspection.
Results logged to c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2/ext/json/ext/parser/
gem_make.out

Visual Studio 2005をインストールしているので、
"C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat"
をコマンドプロンプトから実行して環境変数を設定。
※このvsvars32.batはとても便利。ILDasmなどいろいろなツールへのパスを設定してくれる。
再び gem install jsonすると、今度は以下のエラー。

$ gem install json
Building native extensions.  This could take a while...
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.
c:/ruby/bin/ruby.exe extconf.rb install json
creating Makefile
nmake
Microsoft(R) Program Maintenance Utility Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.
        c:\ruby\bin\ruby -e "puts 'EXPORTS', 'Init_parser'"  > parser-i386-mswin
32.def
        cl -nologo -I. -Ic:/ruby/lib/ruby/1.8/i386-mswin32 -Ic:/ruby/lib/ruby/1.
8/i386-mswin32 -I. -MD -Zi -O2b2xg- -G6  -c -Tcparser.c
cl : コマンド ライン warning D9035 : オプション 'Og-' の使用は現在推奨されていま
せん。今後のバージョンからは削除されます。
cl : コマンド ライン warning D9002 : 不明なオプション '-G6' を無視します
parser.c
c:\ruby\lib\ruby\1.8\i386-mswin32\config.h(2) : fatal error C1189: #error :  MSC
 version unmatch
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\c
l.EXE"' :
Stop.
Gem files will remain installed in c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2 for
 inspection.
Results logged to c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2/ext/json/ext/parser/
gem_make.out

fatal error が発生しているc:\ruby\lib\ruby\1.8\i386-mswin32\config.hを修正。
ぼくの環境のcl.exeのバージョンは、14.00.50727.762なので、

#if _MSC_VER != 1200
#error MSC version unmatch
#endif

を、

#if _MSC_VER < 1200
#error MSC version unmatch
#endif

に修正すると、無事インストール完了!
参考: 2008-02-03 - mallowlabsの備忘録

シリアライズ化における注意事項

SessionにHashtableを継承したクラスのオブジェクトを格納して取り出そうとしたら、
「~型のオブジェクトを逆シリアル化するコンストラクタが見つかりませんでした。」
という例外発生。
デシリアライズするコンストラクタを実装したら解決。
シリアライズ化するオブジェクトのクラスには、
[Serializable]と、デシリアライズのためのコンストラクタの実装が必要。

[Serializable]
public class Class1 : Hashtable
{
    private Hashtable copy;
    public Hashtable Copy
    {
        get { return copy; }
        set
        {
            foreach (string key in value.Keys)
            {
                copy[key] = this[key];
            }
        }
    }
    public Class1()
    {
        copy = new Hashtable();
    }
    public override object this[object key]
    {
        get
        {
            return base[key];
        }
        set
        {
            base[key] = value;
        }
    }
    protected Class1(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
        copy = new Hashtable();
    }
    public new void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("copy", copy, typeof(Hashtable));
    }
}

Dictionary ジェネリック クラスにはまってしまった。(シリアライズ化における注意事項)
窓際プログラマーの独り言 -C#の話題を中心に:FxCopに学ぶ番外編(4) : ISerializable を正しく実装します