- Remove From My Forums
-
Общие обсуждения
-
Если в List<object> содержатся строки, числа и т.п., то проблем нет, но если занести туда массив, к примеру, строк, то при сериализации получаем ошибку
System.InvalidOperationException: Ошибка при создании документа XML. —> System.InvalidOperationException: Тип «System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]» не может использоваться в этом контексте.
Соответственно вопрос — можно ли как-то сериализовать List<object>, если его элементами могут являться массивы?
-
Изменен тип
2 ноября 2009 г. 8:09
Вопрос перешёл в обсуждения -
Перемещено
Siddharth Chavan
1 октября 2010 г. 21:53
MSDN Forums Consolidation (От:Visual C#)
-
Изменен тип
Здравствуйте, есть веб-сервис для доступа к БД, при попытке запустить метод LogPas()
выдает ошибку
System.InvalidOperationException: Ошибка при создании документа XML. —> System.InvalidOperationException: Невозможно сериализовать System.Data.Common.DataRecordInternal, т.*к. он не имеет беспараметрического конструктора.
[WebMethod]
public ArrayList LogPas()
{
ArrayList allData = new ArrayList();
SqlConnection con = new SqlConnection(connectionString);
SqlCommand com = new SqlCommand("SELECT * FROM Student", con);
con.Open();
SqlDataReader dr = com.ExecuteReader();
if (dr.HasRows)
{ foreach (DbDataRecord result in dr)
allData.Add(result);
return allData;
}
else return null;
}
Deleted
3711 золотой знак5 серебряных знаков13 бронзовых знаков
задан 20 мая 2013 в 10:08
Вам компилятор и так всё сказал. Передать объект с типом DataRecordInternal не получится, так как для сериализации требуется конструктор без параметров, коего нет у данного типа.
Самое простое решение — использовать другой класс.
ответ дан 20 мая 2013 в 10:13
SpawnSpawn
2,50811 серебряных знаков20 бронзовых знаков
7
DCNick3 4 / 4 / 6 Регистрация: 03.05.2014 Сообщений: 101 |
||||
1 |
||||
01.06.2015, 00:08. Показов 6750. Ответов 2 Метки нет (Все метки)
Пытаюсь сериализировать — Фиг Exception Необработанное исключение типа «System.InvalidOperationException» в System.Xml.dll Дополнительные сведения: Ошибка при создании документа XML. Привожу классы: Class’ы
Может проблема в абстрактах… Кароч выручайте, как можно изменить. P.S. BinaryFormatter не пойдёт, ибо фалы человеки писать будут (в основном будем их читать)
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
01.06.2015, 00:08 |
Ответы с готовыми решениями:
XML сериализация 1. Как при сериализации XmlSerializer xmlSerializer = new… Сериализация в xml XML сериализация списка 2 |
Someone007 6316 / 3935 / 1577 Регистрация: 09.05.2015 Сообщений: 9,237 |
||||||||
01.06.2015, 04:33 |
2 |
|||||||
0 |
DCNick3 4 / 4 / 6 Регистрация: 03.05.2014 Сообщений: 101 |
||||||||
01.06.2015, 21:58 [ТС] |
3 |
|||||||
Сериализую так:
Добавлено через 3 минуты More DATA
System.InvalidOperationException не обработано Добавлено через 15 минут
1 |
I’m trying to so some serialization using C#, but it throws an exception saying that there was an error generating the xml document
. This is where I do the serialization:
public void serialize()
{
try
{
XmlSerializer ser = new XmlSerializer(typeof(Repository<Student>));
StreamWriter myWriter = new StreamWriter("stud.xml");
ser.Serialize(myWriter, rep);
myWriter.Close();
}
catch (Exception e)
{
Console.WriteLine("Error " + e.Message);
}
}
And this is the class I want to serialize:
public class Repository<T> : MyStack<T>
{
public int size;
public int capacity;
public SLL<T> stud;
public Repository()
{
/*
* Creator for class Repository.
*/
this.stud = new SLL<T>();
this.capacity = 20;
this.size = 0;
}
where MyStack
is an interface, and SSL<T>
is singly-linked list I have implemented.
asked Jan 11, 2014 at 13:49
1
Please add the full details of your exception to isolate the problem. From the code that you posted, it looks like your classes are not serializable.
Are the Repository, MyStack, SSL serializable classes (do you have the [Serializable] attribute on all the types of the members that will be serialized?)
answered Jan 11, 2014 at 13:58
Cosmin VanăCosmin Vană
1,55212 silver badges28 bronze badges
2
It looks odd to serialise the repository class. Instead I would serialise the SLL<T>
object, since that is the actual data you are interested in. The repository is just wrapper object for getting to data, thus there’s no reason to serialise that.
As Cosmin mentions, make sure you place a [Serializable]
attribute on SLL<>
[Serializable]
public class SLL<T>
{
}
answered Jan 11, 2014 at 14:02
Jason EvansJason Evans
28.9k14 gold badges88 silver badges154 bronze badges
1
Here is an example how to serialize. i think you might miss some important parts:
[Serializable]
public class User
{
[XmlElement("login")]
[Key]
public string login { get; set; }
[XmlElement("KDP")]
public int KDP { get; set; }
[XmlElement("attended")]
public int attended { get; set; }
etc.
the public getters and setters are important if you ever plan to deserialize.
and here is example how to serialize list of these:
[XmlArrayItem(typeof(User))]
[XmlElement("usersList")]
public static List<User> usersList = new List<User>();
using (StreamWriter myWriter = new StreamWriter(usersPath, false))
{
userSerializer.Serialize(myWriter, usersList);
myWriter.Close();
}
hope it helps.
answered Jan 11, 2014 at 14:08
wondrawondra
3,2213 gold badges28 silver badges46 bronze badges
Use [XmlIgnore] attribute for the property which is causing error generating the xml document, so that other things can be parsed.
answered Jun 19, 2018 at 15:05
#c# #winforms #stream #xml-serialization
#c# #winforms #поток #xml-сериализация
Вопрос:
XmlSerializer formatter = new XmlSerializer(typeof(List<Objects.PIP>));
**MemoryStream stream = new MemoryStream(new byte[1024]);**
formatter.Serialize(stream, Repository.GlobalRepository.PIPInformation);
byte[] bt = stream.ToArray();
foreach (Communication.Client Client in server.ClientList)
{
Client.SendMessage(bt);
}
stream.Flush();
Я получаю ошибку в выделенной строке как:
Произошла ошибка при создании XML-документа.
InnerException {«Поток памяти не может быть расширен».}
PIP Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ObjectLibrary.Model;
using System.Xml.Serialization;
namespace PIPServer.Objects
{
[XmlRoot(Namespace = "urn:my-namespace")]
public class PIP
{
private long pipID;
public long PipID
{
get { return pipID; }
set { pipID = value; }
}
private CurrencyPair currencyPair;
public CurrencyPair CurrencyPair
{
get { return currencyPair; }
set { currencyPair = value; }
}
...............
}
}
Что я делаю не так?
Также корректен ли мой метод преобразования потока в массив байтов? [Ответил]
Комментарии:
1. Скорее всего, это что-то другое в вашем классе PIP. Пожалуйста, дайте нам полное определение класса
2. есть только другие свойства, ничего больше…
Ответ №1:
У MemoryStream
есть ToArray()
метод, который вы можете использовать. Он возвращает массив байтов со всем содержимым потока. Просто убедитесь, что вы закончили запись в поток, прежде чем читать содержимое. 🙂
Что касается ошибки, на нее трудно ответить без дополнительной информации. Вы убедились, что все объекты, которые вы пытаетесь сериализовать, действительны?
Редактировать:
Из ваших комментариев я думаю, что знаю, в чем проблема. Вы определяете MemoryStream
с фиксированным размером 1024 байта. Когда вы сериализуете свой объект, сгенерированный XML-файл больше этого, и в итоге вы получаете сообщение об ошибке, в котором говорится, что вы не можете расширить поток памяти. Попробуйте создать его, не задавая явный размер (просто используйте
новый MemoryStream()
), или установите больший размер.
Кроме того, если вы не хотите сериализовать свойство, просто пометьте его XmlIgnore
атрибутом.
Комментарии:
1. существует внутренний объект CurrencyPair, который мне тоже нужно сериализовать. а также я не хочу сохранять этот объект, который я могу игнорировать.
2. Внутреннее исключение {«Поток памяти не может быть расширен».}
Ответ №2:
С вашим обновлением, включающим внутреннее исключение, становится ясно: поскольку вы инициализируете MemoryStream массивом байтов фиксированного размера, весь XML должен умещаться в ваших 1024 байтах. Похоже, у вас достаточно свойств, чтобы сделать это проблемой.
Вы действительно имели в виду максимум 1024 байта, или вы намеревались установить начальный размер для потока. Последнее было бы:
MemoryStream stream = new MemoryStream(1024);
Я пишу веб-приложение с использованием MVC3, но при попытке передать объект контроллеру и показать его, похоже, он не распознает тип или что-то еще.
У меня есть объект Job, a JobService
возвращает a Job
следующим образом:
public Job View(int jobId)
{
Job job=_jobRepository.Jobs.Where(x => x.Id == jobId).FirstOrDefault();
return job;
}
В WebService я вызываю View следующим образом:
[WebMethod]
public Job GetJob(GetJobRequest getJobRequest)
{
var getJobResponse = new GetJobResponse();
getJobResponse.Job = _jobService.View(getJobRequest.Id);
return getJobResponse.Job;
}
Затем контроллер вызывает это:
public class JobsController : Controller
{
public ActionResult Index()
{
var jobModel = new JobModel();
using (var webServiceSoapClient = new WebServiceSoapClient())
{
var getJobRequest = new GetJobRequest();
getJobRequest.Id = 26038;
jobModel.Job = webServiceSoapClient.GetJob(getJobRequest);
}
return View(jobModel);
}
}
И он бросает эту ошибку:
System.Web.Services.Protocols.SoapException: сервер не смог обработать запрос. — > System.InvalidOperationException: произошла ошибка генерации XML-документа. — > System.InvalidOperationException: Тип System.Data.Entity.DynamicProxies.Job_55765AEC3BD02AFD7E0527408ED5746E1054965A59B82A127B5A688C19C61D5B не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически. в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write9_Job (String n, String ns, Job o, Boolean isNullable, Boolean needType) в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write18_GetJobResponse (Object [] p) в Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer13.Serialize(Object objectToSerialize, XmlSerializationWriter writer) в System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces пространства имен, String encodingStyle, String id) — Конец внутренней проверки стека исключений — в System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces пространства имен, String encodingStyle, String id) в System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object [] returnValues, Stream outputStream) в System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object [] returnValues) в System.Web.Services.Protocols.WebServiceHandler.Invoke() — Конец внутренней трассировки стека исключений —
Сначала я передавал GetJobResponse
службе, но я попытался сделать ее как можно более простой, чтобы заставить ее работать, и я все еще не могу понять это. Я видел, что есть другие вопросы, предлагающие использование XmlInclude и прочее, но это все еще не работает.
Применяя это:
public string SerializeObjectToXMLString(object theObject)
{
// Exceptions are handled by the caller
using (System.IO.MemoryStream oStream = new System.IO.MemoryStream())
{
System.Xml.Serialization.XmlSerializer oSerializer = new System.Xml.Serialization.XmlSerializer(theObject.GetType());
oSerializer.Serialize(oStream, theObject);
return Encoding.Default.GetString(oStream.ToArray());
}
}
К заданию, возвращенному View в тесте, проходит тест, поэтому я думаю, что проблема исходит из моего веб-сервиса.
Пожалуйста, помогите meeee: ‘(
MemoryStream
имеет ToArray()
метод, который вы можете использовать. Возвращает байтовый массив со всем содержимым потока. Просто убедитесь, что вы закончили запись в поток, прежде чем читать содержимое.:-)
Что касается ошибки, трудно ответить без дополнительной информации. Вы убедились, что все объекты, которые вы пытаетесь сериализовать, действительны?
Редактировать:
Из ваших комментариев я думаю, что знаю, в чем проблема. Вы определяете MemoryStream
с фиксированным размером 1024 байта. Когда вы сериализуете ваш объект, сгенерированный xml будет больше, чем этот, и вы получите ошибку, говорящую о том, что вы не можете расширить поток памяти. Попробуйте создать его без установки явного размера (просто используйте
новый MemoryStream ()
) или установите больший размер.
Кроме того, если вы не хотите сериализовать свойство, просто пометьте его XmlIgnore
приписывать.