我正在尝试使用字符串属性创建用于序列化/反序列化的ac#对象.该属性需要生成一个元素,并且还具有一个属性:
例如:
...
<Comment Name="CommentName"></Comment>
...
Run Code Online (Sandbox Code Playgroud)
如果属性是字符串,我无法看到如何添加属性,如果注释是具有Name和Value属性的对象,则会生成:
...
<Comment Name="CommentName">
<Value>comment value</Value>
</Comment>
...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在为Java ws制作.net wcf客户端。但是当我发出一个请求,并且响应包含错误时,它也包含multiRef部分。所以我得到这个异常:
服务器返回了无效的SOAP错误。来自名称空间“ http://schemas.xmlsoap.org/soap/envelope的结束元素” Body” 。从名称空间中找到元素'multiRef'''
这是服务器响应的样子(直接从网络获取):
<soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
<soapenv:Fault>...</soapenv:Fault>
<multiRef>...</multiRef>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
有什么方法可以配置我的wcf客户端以反序列化该消息吗?还是有可能获取原始响应xml?
为简单起见,我将使用水果显示我的示例代码.实际上我正在做一些更有意义的事情(我们希望).假设我们有一个枚举:
public enum FruitType
{
Apple,
Orange,
Banana
}
Run Code Online (Sandbox Code Playgroud)
一节课:
[Serializable]
public class Fruit
{
public FruitType FruitType { get; set; }
public Fruit(FruitType type)
{
this.FruitType = type;
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以对它进行序列化和反序列化.现在,让我们修改枚举,现在它是:
public enum FruitType
{
GreenApple,
RedApple,
Orange,
Banana
}
Run Code Online (Sandbox Code Playgroud)
反序列化以前序列化的对象时,会出现System.InvalidOperation异常,因为Apple(原始枚举项)无效.该对象不会被反序列化.
我能够解决这个问题的一种方法是在序列化时为类中的FruitType属性赋予Fruit不同的名称,如下所示:
[XmlElement(ElementName = "Mode")]
public FruitType FruitType { get; set; }
Run Code Online (Sandbox Code Playgroud)
现在,在反序列化期间,旧属性将被忽略,因为找不到它.我想知道是否有一种方法可以在反序列化期间忽略/跳过无效的枚举项,这样就不会抛出异常并且对象仍然会被反序列化.
c# serialization xml-serialization xml-deserialization deserialization
我有一个.Net Webservice,它返回一个简单的序列化对象.
我有以下代码来获取我的.Net webservice的响应.如何将返回的XML反序列化为我的对象?
我想返回MyObject而不是SoapPrimitive.
private static SoapPrimitive callWebServiceMethod(String url,
String namespace, String methodName,
HashMap<String, Object> parameters, String soapAction)
throws Exception {
Log.i("WebService", "URL: " + url);
Log.i("WebService", "MethodName: " + methodName);
URL myurl = new URL(url);
URLConnection connection = myurl.openConnection();
connection.setConnectTimeout(20 * 1000);
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK)
{
httpConnection.disconnect();
SoapObject request = new SoapObject(namespace, methodName);
if (parameters != null) {
String[] keys = new String[0];
keys = (String[]) parameters.keySet().toArray(keys);
Object[] …Run Code Online (Sandbox Code Playgroud) 我通过API收集xml格式的一些数据,并希望在对象列表中反序列化它.我正在使用Symfony2并找出JMSSerializerBundle,但我真的不知道如何使用它.
我知道Sf2允许将对象序列化/反序列化到数组,但我正在寻找更具体的东西.例如,对于这个类:
class Screenshot
{
/**
* @var integer $id
*/
private $id;
/**
* @var string $url_screenshot
*/
private $url_screenshot;
public function __construct($id, $url_screenshot) {
$this->id = $id;
$this->url_screenshot = $url_screenshot;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set url_screenshot
*
* @param string $urlScreenshot
*/
public function setUrlScreenshot($urlScreenshot)
{
$this->url_screenshot = $urlScreenshot;
}
/**
* Get url_screenshot
*
* @return string
*/
public function getUrlScreenshot()
{ …Run Code Online (Sandbox Code Playgroud) 我有一个如下定义的类:
[XmlRoot("ClassName")]
public class ClassName_0
{
//stuff...
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个ClassName_0列表,如下所示:
var myListInstance= new List<ClassName_0>();
Run Code Online (Sandbox Code Playgroud)
这是我用来序列化的代码:
var ser = new XmlSerializer(typeof(List<ClassName_0>));
ser.Serialize(aWriterStream, myListInstance);
Run Code Online (Sandbox Code Playgroud)
这是我用来反序列化的代码:
var ser = new XmlSerializer(typeof(List<ClassName_0>));
var wrapper = ser.Deserialize(new StringReader(xml));
Run Code Online (Sandbox Code Playgroud)
如果我将它序列化为xml,则生成的xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfClassName_0 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ClassName_0>
<stuff></stuff>
</ClassName_0>
<ClassName_0>
<stuff></stuff>
</ClassName_0>
</ArrayOfClassName_0>
Run Code Online (Sandbox Code Playgroud)
有没有办法序列化并能够从/向ClassName_0列表反序列化以下内容?
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfClassName xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ClassName>
<stuff></stuff>
</ClassName>
<ClassName>
<stuff></stuff>
</ClassName>
</ArrayOfClassName>
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在尝试反序列化一个XML字符串,其中元素的值不在我的Enum值的范围内.
Public enum MyEnum
{
Unknown,
Car,
Bicycle,
Boat
}
[SerializableAttribute()]
public class MyClass
{
private string _id;
private MyEnum _myEnum;
public string ID
{
get { return _id; }
set { _id = value; }
}
public MyEnum EnumValue
{
get { return _myEnum; }
set { _myEnum = value; }
}
public MyClass(string id)
{
this._id = id;
}
public MyClass() : this("") { }
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试反序列化后面的字符串(注意Plane作为枚举值):
<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><MyClass><ID>1234567890123456789</ID><EnumValue>Plane</EnumValue></MyClass>
Run Code Online (Sandbox Code Playgroud)
然后我的反序列化将抛出异常,甚至在它为EnumValue命中我的公共字段之前,会出现以下异常消息:
实例验证错误:'Plane'不是EnumValue的有效值
是否可以返回EnumValue的默认值,如果我尝试在XML中解析的值不支持EnumValue?例如.对于此处提供的XML字符串,EnumValue应设置为"Unknown".
对我之前问题的附件参考:-内存不足
我会尽量准确。我从我的网络服务调用一个长 base64 字符串得到响应。我解码字符串并得到一个包含我的数据的巨大字符串。我反序列化字符串并使用如下字符串创建我的类的对象。
String decryptedXml = XmlObject.toDecryptedXmlString(gameDetail.getGameData(), app.getSessionEncryptionKey());
Game noviceGame = deserialiseGame(decryptedXml, NoviceGamer.class);
Run Code Online (Sandbox Code Playgroud)
desrialiseGame() 只是一种反序列化数据并创建并返回我的游戏实例的方法。为了将这个对象维护到多个会话(登录/注销),我将整个游戏数据(我的反序列化给了我游戏实例的字符串)存储在数据库中。
下次当用户登录时,为了创建游戏实例,我从我的数据库中获取字符串并再次尝试反序列化,以便我取回我的游戏实例。但是当我尝试从我的数据库中获取字符串时,我在获取字符串时遇到“内存不足”异常。
调用反序列化游戏的方法如下。
private HashMap<String, Game> games = new HashMap<String, Game>();
public void load(LocalDatabaseHelper localDbHelper) throws Exception
{
synchronized(gameLockObject) {
GameDetailDAO dao = new GameDetailDAO(localDbHelper);
//this will fetch me the all the entities from databse
ArrayList<GameDetailEntity> dbGameDetails = dao.getEntities(null, null);
for (GameDetailEntity gameDetail : dbGameDetails) {
String gameLevel = gameDetail.getDetailLevel();
String gameXml = gameDetail.getGameData();
Game game = null;
if(gameLevel.equalsIgnoreCase("Novice")) {
game = Job.deserialiseJob(gameXml, NoviceLevel.class); …Run Code Online (Sandbox Code Playgroud) 我有以下xml:
<Applications>
<AccessibleApplication></AccessibleApplication>
<AccessibleApplication></AccessibleApplication>
<EligibleApplication></EligibleApplication>
<EligibleApplication></EligibleApplication>
</Applications>
Run Code Online (Sandbox Code Playgroud)
有没有办法将其反序列化为 C# 对象,以便 AccessibleApplications 和 EligibleApplications 是两个单独的数组?我尝试了以下但得到一个例外,因为“应用程序”被使用了不止一次。
[XmlArray("Applications")]
[XmlArrayItem("AccessibleApplication")]
public List<Application> AccessibleApplications { get; set; }
[XmlArray("Applications")]
[XmlArrayItem("EligibleApplication")]
public List<Application> EligibleApplications { get; set; }
Run Code Online (Sandbox Code Playgroud)
例外情况是:来自命名空间 '' 的 XML 元素 'Applications' 已经存在于当前作用域中。使用 XML 属性为元素指定另一个 XML 名称或命名空间。
这是可能的吗?
谢谢!
编辑:我忘了提到我不想仅仅为了为两个数组提供容器对象而拥有一个“应用程序”类。我有几种这样的情况,我不希望这些类的混乱,它们的唯一目的是拆分两个相同类型的数组。
我希望能够使用诸如 [XmlArrayItem="Application/AccessibleApplication"] 之类的某种标记将两个数组反序列化为外部对象,而无需创建“应用程序”类。
我使用的 XML API 可以选择仅检索响应的一部分。NULL如果使用此功能,这会导致生成的对象具有很多属性。有没有办法真正跳过NULL属性?我试图实施排除策略
shouldSkipProperty(PropertyMetadata $property, Context $context)`
Run Code Online (Sandbox Code Playgroud)
但我意识到无法访问当前的属性值。
一个例子是以下类
class Hotel {
/**
* @Type("string")
*/
public $id;
/**
* @Type("integer")
*/
public $bookable;
/**
* @Type("string")
*/
public $name;
/**
* @Type("integer")
*/
public $type;
/**
* @Type("double")
*/
public $stars;
/**
* @Type("MssPhp\Schema\Response\Address")
*/
public $address;
/**
* @Type("integer")
*/
public $themes;
/**
* @Type("integer")
*/
public $features;
/**
* @Type("MssPhp\Schema\Response\Location")
*/
public $location;
/**
* @Type("MssPhp\Schema\Response\Pos")
*/
public $pos;
/**
* @Type("integer") …Run Code Online (Sandbox Code Playgroud)