2010-02-19 3 views
2

Я работаю над некоторыми классами, которые мне нужно для сериализации/десериализации в xml, которые могут быть использованы для конфигурации. Вот пример того, что я пытаюсь сделать.NET Custom Xml Serialization

[Serializable] 
public class MyConfig 
{ 
    [XmlElement] 
    public string ConfigOption { get; set; } 
    [XmlElement] 
    public Uri SomeUri { get; set; } 
} 

Я хочу, чтобы переопределить путь, что свойство Ури сериализации. Поэтому, когда метод сериализации называется, я хочу, чтобы это выглядело как этот

<MyConfig> 
    <ConfigOption></ConfigOption> 
    <SomeUri uri="" /> 
</MyConfig> 

Есть ли способ, чтобы включить в .net сериализации и переопределить как все объекты Uri являются сериализации и десериализации? Обратите внимание, что я не хочу создавать класс MyUri и использовать его как тип SomeUri, я просто хочу подключиться к тому месту, где сериализованные сериализуют типы Uri и переопределяют это поведение.

+1

[Serializable] игнорируется для XML-сериализации. – Cheeso

+0

Возможный дубликат: http://stackoverflow.com/questions/2211859/xml-serializing-arrays-with-typearray-in-net/2211921 – 2010-02-19 18:57:00

+1

BTW, _all_ Сериализация XML является «обычным». –

ответ

3
public class MyConfig 
{ 
    [XmlElement] 
    public string ConfigOption { get; set; } 
    [XmlElement] 
    public MyUri SomeUri { get; set; } 
} 

public class MyUri 
{ 
    [XmlAttribute(Name="uri")] 
    public Uri SomeUri { get; set; } 
} 
+0

да, это сработает, но я не хочу создавать другой класс для переноса любого объекта, который мне нужен для сериализации/десериализации по-разному. Я хочу подключиться к месту, где это свойство сериализуется и контролировать, как он должен выглядеть. –

+0

Нет такого места. Единственный выбор - полностью перенести сериализацию. –

+0

Также, если вы используете XmlSerializer с этим кодом, это не сработает, так как Uri не имеет конструктора по умолчанию, его нельзя сериализовать с помощью XmlSerializer, если вы хотите, чтобы объект Uri был сериализован, вам нужно реализовать IXmlSerializable, а затем взять на себя, где необходимо. Было бы проще сохранить его как строку в публичном сериализованном свойстве, если вы хотите использовать XmlSerializer. –

2

Поскольку вы не хотите, чтобы создать новый класс-обертку для Uri, я думаю, что ваша единственная альтернатива для MyConfig реализации IXmlSerializable для того, чтобы иметь полный контроль над процессом XML сериализации.

Однако, если вы сделаете это, у вас будет все или ничего, потому что вам нужно будет полностью реализовать сериализацию, а не только для свойства Uri.