Я бы использовал переменную-член, которая является IFeatureClassName.Конструктор примет IFeatureclass, затем преобразует класс объектов в IDataset и установит переменную-член в IDataset.FullName.Это будет IName.Все объекты IName сохраняются через IPersistStream.Хотя объект IPersistStream напрямую не сериализуем для xml, он может быть записан в byte [] (через MemoryBlobStream).Не могу вспомнить, можно ли выставить byte [] через XmlAttribute, вероятно, следует использовать base64.Также может быть, что метод Open будет просто вызывать IName.Open для содержащейся переменной элемента featureclassname, возвращая IFeatureclass.
Обновление: вот некоторый код, который может помочь преобразовать имя FeatureClass в строку и из строки.
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;
}
(обновлено для работы с любым набором IDat, а не только с классами пространственных объектов) (обновление 2: объединение clsid позволяет ему работать с любым набором данных, предыдущая версия была зашита для имени функционального класса)
Не спрашивайте меня, почемуESRI не удосужился реализовать IName.NameString .
Свойство NameString зарезервировано для будущего использования.При реализации он вернет строковое представление локального компонента объекта имени, которое может сохраняться приложениями.