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