3

オブジェクトを Visual Studio の settings.settings ファイルに保存できますか? もしそうなら、どのように?オブジェクトをシリアライズ可能にすることができ、永続化できると思いますが、それが正しいかどうかはわかりません。つまり、オブジェクトを取り戻そうとすると、常に null になります。

コードは次のとおりです。

    [Serializable()]
    [XmlRoot(ElementName = "LayerTCA", IsNullable = false, Namespace = "http://somesite.com")]
    public class LayerTCA
    {
        //This is a COM object so I don't want to serialize this.
        IFeatureClass featureClass;

        string fullName;
        string basicName;

        public LayerTCA()
        {

        }

        public LayerTCA(IFeatureClass featureClass)
        {
            FeatureClass = featureClass;
        }


        public IFeatureClass FeatureClass
        {
            get { return featureClass; }
            set 
            {
                featureClass = value;
                fullName = featureClass.AliasName;
                basicName = StringHelper.StringAfterLastFullStop(fullName);
            }
        }

        [XmlAttribute(AttributeName = "BasicName")]  
        public string BasicName
        {
            get { return basicName; }
            set { basicName = value; }
        }


        [XmlAttribute(AttributeName = "FullName")]  
        public string FullName
        {
            get { return fullName; }
            set { fullName = value; }
        }

        public override string ToString()
        {
            return FullName;
        }

    }
4

1 に答える 1

1

IFeatureClassName であるメンバー変数を使用します。コンストラクターは IFeatureclass を受け入れ、フィーチャクラスを IDataset にキャストし、メンバー変数を IDataset.FullName に設定します。これは IName になります。すべての IName オブジェクトは、IPersistStream を介して永続化できます。xml に直接シリアル化することはできませんが、IPersistStream オブジェクトは (MemoryBlobStream を介して) byte[] に書き込むことができます。XmlAttribute を介して byte[] を公開できるかどうかを思い出せません。おそらく base64 を使用する必要があります。また、含まれるメンバーの featureclassname 変数に対して IName.Open を呼び出し、IFeatureclass を返す Open メソッドを使用することもできます。

更新: フィーチャクラス名と文字列との間の変換に役立つコードを次に示します。

public static void TestIt(IFeatureClass fc)
{
    string guidplusbase64Name = GetFullName((IDataset)fc);
    Debug.Print(guidplusbase64Name);
    IFeatureClass fc2 = OpenDataset(guidplusbase64Name) as IFeatureClass;
    Debug.Print(fc2.AliasName);            
}

public static string GetFullName(IDataset ds)
{
    IPersistStream ps = ds.FullName as IPersistStream;
    Guid g;
    ps.GetClassID(out g);            
    IMemoryBlobStream mbs = new MemoryBlobStreamClass();
    ps.Save(mbs,0);
    object bytes;
    ((IMemoryBlobStreamVariant)mbs).ExportToVariant(out bytes);            
    return String.Format("{0};{1}",g,Convert.ToBase64String((byte[])bytes));
}

public static IDataset OpenDataset(string guidplusbase64Name)
{
    int idx = guidplusbase64Name.IndexOf(";");
    string base64Name = guidplusbase64Name.Substring(idx+1);
    string guidString = guidplusbase64Name.Substring(0, idx);

    byte[] bytes = Convert.FromBase64String(base64Name);
    IMemoryBlobStream mbs = new MemoryBlobStreamClass();
    ((IMemoryBlobStreamVariant)mbs).ImportFromVariant(bytes);
    Type t = Type.GetTypeFromCLSID(new Guid(guidString));
    IName n = Activator.CreateInstance(t) as IName;
    ((IPersistStream)n).Load(mbs);
    IDataset ds = n.Open() as IDataset;
    return ds;
}

(フィーチャクラスだけでなく、任意の IDataset で動作するように更新されました) (更新 2: clsid を連結すると、任意のデータセットで動作できるようになります。以前のバージョンはフィーチャクラス名に組み込まれていました)

ESRI がIName.NameStringの実装に取り​​組まなかった理由を聞かないでください。

NameString プロパティは、将来の使用のために予約されています。実装すると、名前オブジェクトの位置コンポーネントの文字列表現が返されます。これは、アプリケーションによって永続化される可能性があります。

于 2010-06-16T14:18:53.703 に答える