我创建了一个简单的WCF应用程序,它公开了一个操作 此操作将复合数据类型作为参数.
我没有使用[DataContract]属性修饰此复合数据类型.但这是有效的,我可以在WSDL中看到Schema.
现在我的理解是这个新的自定义类型应该用[Serializable]或[dataContract]属性进行修饰以参与Web服务操作.
我在这里缺少什么?
我是XmlSerializer的新手.我写了一个小类来保存数据库中的条目:
[Serializable]
public struct Entry
{
public string artkey, lid, request, status, requestdate;
}
Run Code Online (Sandbox Code Playgroud)
很简单吧?序列化这些列表应该是小菜一碟.
我有一个编译这些列表的函数.要序列化我的列表,我尝试以下代码:
XmlSerializer serializer = new XmlSerializer(typeof(Entry));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
serializer.Serialize(ms, entries.ToArray());
ms.WriteTo(Response.OutputStream);
Run Code Online (Sandbox Code Playgroud)
此代码打印以下异常:
<error>System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidCastException: Specified cast is not valid.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterEntry.Write3_Entry(Object o)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o, XmlSerializerNamespaces namespaces)
at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o) …Run Code Online (Sandbox Code Playgroud) 当我尝试反序列化soap消息时,我得到以下异常.我这样做是因为我有我想在测试中重用的响应文件.我不能使用真实的服务或类似的东西,因为它不适合我们的测试框架的架构.
Test 'MyUnitTestMethod' failed: System.InvalidOperationException : There is an error in XML document (1, 2).
----> System.InvalidOperationException : <MySpecialResponse xmlns='http://xsd.com/msgs/v1'> was not expected.
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
private const string _content =
@"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"">
<soapenv:Body>
<ns3:MySpecialResponse xmlns:ns3=""http://xsd.com/msgs/v1"" >
<header>
<status>0</status>
</header>
<ns3:Payload>
<ns3:CustomerName>name</ns3:CustomerName>
<ns3:EmailAddress>test1@mail.com</ns3:EmailAddress>
</ns3:Payload>
</ns3:MySpecialResponse>
</soapenv:Body>
</soapenv:Envelope>";
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://xsd.com/msgs/v1")]
public partial class MySpecialResponse : BaseResponse {
private MySpecialPayload payloadField;
/// <remarks/> …Run Code Online (Sandbox Code Playgroud) 我有一个XmlSerializer,我用它来将对象序列化为XDocument.
var doc = new XDocument();
using (var writer = doc.CreateWriter())
{
xmlSerializer.Serialize(writer, object);
}
Run Code Online (Sandbox Code Playgroud)
完成此操作后,我想添加一个XDeclaration:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
Run Code Online (Sandbox Code Playgroud)
我构建了这个XDeclaration,如下所述:
var decl = new XDeclaration("1.0", "UTF-8", "no");
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将此XDeclartion添加到我的XDocument时,我收到以下错误:
System.ArgumentException : Non white space characters cannot be added to content.
Run Code Online (Sandbox Code Playgroud)
我搜索谷歌已经有一段时间了,但我发现只是将XDeclaration添加到XDocument的构造函数中,在我的情况下(当用XmlWriter填充它时)是不可接受的.
我在这里有一些@ javax.xml.bind.annotation.Xml ...注释类用于RESt Web服务.Jersey是在一个Spring托管的Web容器中设置的,Web服务正在返回格式良好的xml.我们使用maven-enunciate-plugin来记录Web服务并为返回的xml文档创建xsd.我现在想将文档xsd文件用作返回的xml文件中的schemaLocation,以便xml验证不会抱怨缺少定义.如何为此配置XML序列化?
我正在使用一些现有的代码,定义如下.
class Example
{
public float x_field;
public float x_property
{
get { return x_field; }
set { x_field = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它这样定义我不知道,但我无法改变它的实现.问题是,当我序列化它时,我显然在xml输出中得到了两个值.如果我无法修改'Example'类,怎么能阻止这种情况发生?
我希望Serializer只输出公共属性而不是公共字段.
我在数据库中有一个存储过程,它返回一个XML流,应用程序将该流反序列化为相应的对象.存储过程是这样定义的(我简化了它以使其更具可读性):
SELECT
usrs.FirstName AS 'FirstName',
usrs.LastName AS 'LastName',
usrs.Username AS 'Username',
usrs.DateJoined AS 'DateJoined'
FROM USERS AS usrs
WHERE usrs.Username = @username
FOR XML PATH('UserProfile')
Run Code Online (Sandbox Code Playgroud)
请注意,这Username是一个主键,因此存储过程将只返回一个结果.示例查询结果如下所示:
<UserProfile>
<FirstName>Chuck</FirstName>
<LastName>Norris</LastName>
<Username>chuck.awesome</Username>
<DateJoined>2013-07-22T06:58:00</DateJoined>
</UserProfile>
Run Code Online (Sandbox Code Playgroud)
现在在应用程序中,这是我获取和反序列化数据的方式:
internal static T GetData<T>(StoredProcedures storedProcedure, ParameterList parameters)
{
using (var connection = GetSqlConnection())
{
using (var command = new SqlCommand(storedProcedure.ToString(), connection))
{
command.CommandType = System.Data.CommandType.StoredProcedure;
foreach (var parameter in parameters)
{
command.Parameters.Add(new SqlParameter(parameter.Key.ToString(), parameter.Value));
}
connection.Open();
var data = command.ExecuteScalar();
return DeserializeXml<T>(data.ToString());
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Xml进行血清化XmlSerializer.我正在执行序列化ClassA,其中包含名为MyPropertytype的属性ClassB.我不希望ClassB序列化特定属性.
我必须使用,XmlAttributeOverrides因为这些类在另一个库中.如果财产ClassA本身,它将是直截了当的.
XmlAttributeOverrides xmlOver = new XmlAttributeOverrides();
XmlAttributes xmlAttr = new XmlAttributes();
xmlAttr.XmlIgnore = true;
xmlOver.Add(typeof(ClassA), "MyProperty", xmlAttr);
XmlSerializer ser = new XmlSerializer(typeof(ClassA), xmlOver);
Run Code Online (Sandbox Code Playgroud)
如果属性在ClassB,我们需要序列化如何完成ClassA?
我目前创建了一个使用XmlSerializer从对象创建XML文件的函数.我一直在研究使用不同形式的多线程,以便在GUI仍然可用且仍在更新的同时将文件保存在后台.我看过使用AsyncTask来做这件事,但我不确定实现它的最佳方法是什么.请任何人帮助我,并提前感谢你.
这是我到目前为止的代码:
private String fileName;
private DataObjects dataObjects;
public SetCachedValuesFile()
{
}
public void setFileName(String refFileName)
{
fileName = refFileName;
}
public void setDataObjects(DataObjects refDataObjects)
{
dataObjects = refDataObjects;
}
public String getFileName()
{
return fileName;
}
public DataObjects getDataObjects()
{
return dataObjects;
}
public void updateValues()
{
ArrayList<DataObject> arrayListDataObject = dataObjects.getDataObjects();
try
{
/* Creates a new file and its directory. */
File directory = new File(Environment.getExternalStorageDirectory() + "/XML_FILES/");
directory.mkdirs();
File newFile = new File(directory, fileName + ".xml");
FileOutputStream …Run Code Online (Sandbox Code Playgroud) 我们目前正在尝试使用XmlSerializer.Serialize将一组对象序列化为xml
我们已经使用以下存根测试了XmlSerializer
private static void TestMethod()
{
ChartContentConfig Config = new ChartContentConfig();
Config.DefinitionId = "6790e2ca-be93-48dd-94e7-f8ec0f6e5fd4";
Config.Sorts = null;
Config.DataFields = new DataField[1];
Config.DataFields[0] = new DataField()
{
Aggregator = AggregateFunction.Sum,
ApplyFilter = ApplyFilter.Before,
FieldName = "Hello",
FieldType = typeof(decimal).ToString(),
FilterToValue = "",
FilterFromValue = "",
FilterOperator = FilterOperator.None,
IsVisible = false,
DisplayName = "Hello",
DefaultStyle = "DefaultFormat"
};
Type configType = typeof(DataField);
DataField DataField = Config.DataFields[0];
DataField.MarkerFormat = "MarkerFormatTest";
DataField.SeriesColour = "SeriesColourTest";
DataField.TestProperty = AggregateFunction.Average;
DataField.Aggregator = AggregateFunction.Average;
string test …Run Code Online (Sandbox Code Playgroud)