2017-01-19 2 views
1

Я прочитал только свойство в моем классеКак игнорировать свойство только для чтения во время десериализации XmlSerializer?

[XmlIgnore] 
public string Amount 
{ 
    get { return "Some value"; } 
} 

Когда я пытаюсь десериализация объекта из файла я не хочу, чтобы десериализация идет вбрасывание исключения и я не получаю объект. Я пробовал использовать атрибут xml ignore, но мне это не помогает. Только то, что мне нужно, чтобы установить свойства, которые существуют в моем файле.

XML файл

<?xml version="1.0" encoding="utf-8"?> 
<Class xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Id>1</KaumeheId> 
    <PrivaatKey>123</PrivaatKey> 
</Class> 

Класс

public class Class 
{ 
    public int Id { get; set; } 
    public string PrivaatKey { get; set; } 
    public string Amount 
    { 
     get { return "Some value"; } 
    } 
} 

Serializer

public static class XmlDeserializerService<T> 
{ 
    public static void LoadDataToClass(T obj, string filePath) 
    { 

     XmlSerializer serializer = new XmlSerializer(typeof(T)); 
     using (FileStream fileStream = new FileStream(filePath, FileMode.Open)) 
     { 
      obj = (T) serializer.Deserialize(fileStream); 
     } 
    } 
} 

Дополнительная информация (измененная):

Если я смотрю в отладчике под obj.Amount у меня есть сумма = «obj.Amount» бросил исключение типа System.NullReferenceException

+0

Вы пробовали [XmlAttributeOverrides] (https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeoverrides (V = vs.110) .aspx), чтобы увидеть, ведет ли он себя по-другому? – Carson

+0

Whar - ваше исключение? ваш пример работает с вашим xml (если вы исправите тег Id в xml) –

+2

XmlIgnoreAttribute должен работать так, что XML будет абсолютно игнорировать readonly Property и должен создавать объект только из того, что определено в XML. Более подробная информация об исключении будет приятной. – Tatranskymedved

ответ

2

Я думаю, что проблема в методе десериализации, я бы изменить его вернуть объект:

public static class XmlDeserializerService<T> 
{ 
    public static T LoadDataToClass(string filePath) 
    {  
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 
     using (FileStream fileStream = new FileStream(filePath, FileMode.Open)) 
     { 
      return (T)serializer.Deserialize(fileStream); 
     } 
    } 
} 

Мой класс:

public class Class 
{ 
    public int Id { get; set; } 
    public string PrivaatKey { get; set; } 
    public string Amount 
    { 
     get { return "Some value"; } 
    } 
} 

Если я использую его после этого:

var r = XmlDeserializerService<Class>.LoadDataToClass(@"yourxml"); 

Я вижу все поля:

enter image description here

Это работает, если вы будете иметь действительный XML, тот, который вы предоставили недопустимые Id тег. Действительно один:

<?xml version="1.0" encoding="utf-8"?> 
<Class xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Id>1</Id> 
    <PrivaatKey>123</PrivaatKey> 
</Class> 
+0

Вы описали половину проблемы. Другая половина = при условии, что XML неверен. OP должен заменить этот '' '' '' этим '' '' '' – tym32167

+0

@ tym32167 да, конечно, я написал уже в комментариях, но вы правы, я буду обновлять asnwer –

+0

о да. Извините, не видел. – tym32167

Смежные вопросы